first commit
This commit is contained in:
+149
@@ -0,0 +1,149 @@
|
|||||||
|
# 📋 DNS 解析配置指南
|
||||||
|
|
||||||
|
不管你的域名在哪里注册,SSL Manager 都会自动展示需要的 DNS 解析配置。
|
||||||
|
|
||||||
|
## 🎯 功能说明
|
||||||
|
|
||||||
|
SSL Manager 内置了智能 DNS 配置指南,根据你选择的验证方式自动展示:
|
||||||
|
|
||||||
|
### HTTP-01 验证
|
||||||
|
- 需要域名解析到你的服务器
|
||||||
|
- 需要 80 端口可公网访问
|
||||||
|
- 自动展示 A 记录配置
|
||||||
|
|
||||||
|
### DNS-01 验证(推荐)
|
||||||
|
- 无需 80 端口
|
||||||
|
- 支持通配符证书
|
||||||
|
- 自动添加 TXT 记录(需 API 凭证)
|
||||||
|
|
||||||
|
## 🌐 支持的 DNS 服务商
|
||||||
|
|
||||||
|
| 服务商 | 控制台 | API 配置 |
|
||||||
|
|--------|--------|----------|
|
||||||
|
| Cloudflare | [dash.cloudflare.com](https://dash.cloudflare.com/) | My Profile → API Tokens |
|
||||||
|
| 阿里云 | [dns.console.aliyun.com](https://dns.console.aliyun.com/) | RAM → AccessKey |
|
||||||
|
| 腾讯云 | [console.cloud.tencent.com/dns](https://console.cloud.tencent.com/dns) | 访问管理 → API 密钥 |
|
||||||
|
| GoDaddy | [dcc.godaddy.com](https://dcc.godaddy.com/) | My Products → Apps → CREATE |
|
||||||
|
| NameSilo | [namesilo.com](https://www.namesilo.com/) | My Account → API-Manager |
|
||||||
|
| Namecheap | [namecheap.com](https://www.namecheap.com/) | Profile → API Access |
|
||||||
|
| DNSPod | [dnspod.cn](https://www.dnspod.cn/) | 账户中心 → API 令牌 |
|
||||||
|
| AWS Route53 | [console.aws.amazon.com/route53](https://console.aws.amazon.com/route53/) | IAM → Users |
|
||||||
|
| Google Cloud | [console.cloud.google.com](https://console.cloud.google.com/) | IAM & Admin → Service accounts |
|
||||||
|
| Azure DNS | [portal.azure.com](https://portal.azure.com/) | Azure AD → App registrations |
|
||||||
|
|
||||||
|
## 📖 使用方式
|
||||||
|
|
||||||
|
### 方式一:Web 界面(推荐)
|
||||||
|
|
||||||
|
1. 启动 SSL Manager
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/ssl-manager
|
||||||
|
./scripts/start-ssl-manager.sh start
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 访问 Web 界面
|
||||||
|
```
|
||||||
|
http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 点击"申请新证书"
|
||||||
|
|
||||||
|
4. 选择验证方式后,自动显示 DNS 配置指南
|
||||||
|
|
||||||
|
### 方式二:API 调用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 获取 DNS 配置指南
|
||||||
|
curl http://localhost:3000/api/dns-guide/guide?validationType=dns-01
|
||||||
|
|
||||||
|
# 获取服务商列表
|
||||||
|
curl http://localhost:3000/api/dns-guide/providers
|
||||||
|
|
||||||
|
# 获取指定服务商详情
|
||||||
|
curl http://localhost:3000/api/dns-guide/guide?validationType=dns-01&provider=cloudflare
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 API 响应示例
|
||||||
|
|
||||||
|
### HTTP-01 验证指南
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"currentGuide": {
|
||||||
|
"title": "HTTP-01 验证 - DNS 解析配置",
|
||||||
|
"description": "HTTP-01 验证需要域名解析到你的服务器...",
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"host": "@",
|
||||||
|
"type": "A",
|
||||||
|
"value": "你的服务器 IP 地址",
|
||||||
|
"ttl": "600",
|
||||||
|
"note": "主域名解析到服务器"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"steps": [...],
|
||||||
|
"tips": [...]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### DNS-01 验证指南(带服务商)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"currentGuide": {
|
||||||
|
"title": "DNS-01 验证 - DNS 解析配置",
|
||||||
|
"description": "DNS-01 验证会自动添加 TXT 记录...",
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"host": "_acme-challenge",
|
||||||
|
"type": "TXT",
|
||||||
|
"value": "acme.sh 自动生成",
|
||||||
|
"ttl": "600",
|
||||||
|
"note": "证书申请时自动添加/删除"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"providerInfo": {
|
||||||
|
"name": "Cloudflare",
|
||||||
|
"consoleUrl": "https://dash.cloudflare.com/",
|
||||||
|
"dnsPath": "选择域名 → DNS → Records",
|
||||||
|
"apiPath": "用户头像 → My Profile → API Tokens",
|
||||||
|
"envVars": [
|
||||||
|
{"key": "CF_Key", "note": "API Token 或 Global API Key"},
|
||||||
|
{"key": "CF_Email", "note": "Cloudflare 账户邮箱"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💡 常见问题
|
||||||
|
|
||||||
|
### Q: 我不知道域名在哪里注册怎么办?
|
||||||
|
A: 使用 `whois 你的域名` 命令查询,或查看域名注册时的邮件通知。
|
||||||
|
|
||||||
|
### Q: DNS 记录添加后多久生效?
|
||||||
|
A: 通常 1-10 分钟,取决于 TTL 设置和 DNS 服务商。
|
||||||
|
|
||||||
|
### Q: 可以使用第三方 DNS 吗?
|
||||||
|
A: 可以!域名注册商和 DNS 服务商可以不同。只需将域名的 NS 记录指向第三方 DNS 即可。
|
||||||
|
|
||||||
|
### Q: API 凭证安全吗?
|
||||||
|
A: API 凭证会加密存储在数据库中,仅用于自动添加 DNS 记录。
|
||||||
|
|
||||||
|
## 🔗 相关文档
|
||||||
|
|
||||||
|
- [SSL Manager 使用指南](README.md)
|
||||||
|
- [服务管理](SERVICE.md)
|
||||||
|
- [acme.sh 官方文档](https://github.com/acmesh-official/acme.sh)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**开发**: 小弟 👋
|
||||||
|
**更新日期**: 2026-04-08
|
||||||
+109
@@ -0,0 +1,109 @@
|
|||||||
|
# 🚀 快速启动指南
|
||||||
|
|
||||||
|
## 方式一:一键安装(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/ssl-manager
|
||||||
|
./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 方式二:手动安装
|
||||||
|
|
||||||
|
### 1. 安装后端
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
|
||||||
|
# 配置淘宝 npm 镜像(可选,加速下载)
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
npm install
|
||||||
|
cp .env.example .env
|
||||||
|
# 编辑 .env 配置你的邮箱
|
||||||
|
vim .env
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 安装前端(开发模式)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
|
||||||
|
# 配置淘宝 npm 镜像(可选,加速下载)
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
# 访问 http://localhost:5173
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 生产部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建前端
|
||||||
|
cd frontend
|
||||||
|
|
||||||
|
# 配置淘宝 npm 镜像(可选,加速下载)
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 后端会静态文件,直接访问 http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 首次使用
|
||||||
|
|
||||||
|
1. **访问管理界面** - http://localhost:3000
|
||||||
|
2. **配置 DNS 凭证**(如使用 DNS-01)- 设置 → DNS API 凭证管理
|
||||||
|
3. **申请证书** - 申请证书 → 填写域名 → 选择验证方式 → 提交
|
||||||
|
4. **配置自动续期** - 执行以下命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x scripts/auto-renew.sh
|
||||||
|
crontab -e
|
||||||
|
# 添加:0 0 * * * /root/.openclaw/workspace/ssl-manager/scripts/auto-renew.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 验证安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查后端服务
|
||||||
|
curl http://localhost:3000/api/health
|
||||||
|
|
||||||
|
# 检查 acme.sh
|
||||||
|
~/.acme.sh/acme.sh --version
|
||||||
|
|
||||||
|
# 查看证书列表
|
||||||
|
~/.acme.sh/acme.sh --list
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🆘 故障排查
|
||||||
|
|
||||||
|
### 后端启动失败
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
npm install # 确保依赖已安装
|
||||||
|
node src/index.js # 查看详细错误
|
||||||
|
```
|
||||||
|
|
||||||
|
### 前端构建失败
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
rm -rf node_modules package-lock.json
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### acme.sh 安装失败
|
||||||
|
```bash
|
||||||
|
# 使用 Gitee 镜像手动安装
|
||||||
|
git clone https://gitee.com/Neilpang/acme.sh.git ~/.acme.sh
|
||||||
|
cd ~/.acme.sh
|
||||||
|
./acme.sh --install
|
||||||
|
source ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
有问题随时找小弟!👋
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
# 🔒 SSL 证书管理器
|
||||||
|
|
||||||
|
基于 acme.sh 的 Web 界面 SSL 证书自动化管理工具,支持 Let's Encrypt 免费证书的申请、管理和自动续期。
|
||||||
|
|
||||||
|
## ✨ 功能特性
|
||||||
|
|
||||||
|
- 🌐 **Web 界面** - 直观易用的管理界面,无需命令行
|
||||||
|
- 🔐 **双验证方式** - 支持 HTTP-01 和 DNS-01 验证
|
||||||
|
- 🌍 **多 DNS 服务商** - 支持 Cloudflare、阿里云、腾讯云等 10+ 服务商
|
||||||
|
- 📋 **DNS 配置指南** - 自动展示 DNS 解析配置,不管域名在哪里注册
|
||||||
|
- 🔄 **自动续期** - 内置 cron 脚本,证书到期前自动续期
|
||||||
|
- 📊 **证书监控** - 实时查看证书状态和过期时间
|
||||||
|
- 🔑 **安全存储** - DNS API 凭证加密存储
|
||||||
|
|
||||||
|
## 🏗️ 技术栈
|
||||||
|
|
||||||
|
**后端:**
|
||||||
|
- Node.js + Express
|
||||||
|
- SQLite 数据库
|
||||||
|
- acme.sh 封装
|
||||||
|
|
||||||
|
**前端:**
|
||||||
|
- Vue 3 + Vite
|
||||||
|
- Element Plus UI
|
||||||
|
- Pinia 状态管理
|
||||||
|
|
||||||
|
## 📦 安装部署
|
||||||
|
|
||||||
|
### 1. 前置要求
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- acme.sh(会自动从 Gitee 镜像安装)
|
||||||
|
- Git(用于克隆 acme.sh)
|
||||||
|
- Linux 服务器(推荐 Ubuntu/CentOS)
|
||||||
|
|
||||||
|
### 2. 安装后端
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ssl-manager/backend
|
||||||
|
|
||||||
|
# 配置淘宝 npm 镜像(加速下载)
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 复制环境配置
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# 编辑配置
|
||||||
|
vim .env
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 安装前端
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ssl-manager/frontend
|
||||||
|
|
||||||
|
# 配置淘宝 npm 镜像(加速下载)
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 开发模式
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# 生产构建
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 配置自动续期
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 添加执行权限
|
||||||
|
chmod +x scripts/auto-renew.sh
|
||||||
|
|
||||||
|
# 编辑 crontab
|
||||||
|
crontab -e
|
||||||
|
|
||||||
|
# 添加定时任务(每天凌晨执行)
|
||||||
|
0 0 * * * /root/.openclaw/workspace/ssl-manager/scripts/auto-renew.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 配置说明
|
||||||
|
|
||||||
|
### 环境变量 (.env)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 服务端口
|
||||||
|
PORT=3000
|
||||||
|
|
||||||
|
# ACME 配置
|
||||||
|
ACME_PATH=/root/.acme.sh
|
||||||
|
CERT_DIR=/etc/ssl/certs
|
||||||
|
ACME_EMAIL=your-email@example.com
|
||||||
|
|
||||||
|
# 加密密钥(32 字符)
|
||||||
|
ENCRYPTION_KEY=your-secret-key-here
|
||||||
|
```
|
||||||
|
|
||||||
|
### 支持的 DNS 服务商
|
||||||
|
|
||||||
|
| 服务商 | 环境变量 |
|
||||||
|
|--------|----------|
|
||||||
|
| Cloudflare | CF_Key, CF_Email |
|
||||||
|
| 阿里云 | Ali_Key, Ali_Secret |
|
||||||
|
| 腾讯云 | Tencent_SecretId, Tencent_SecretKey |
|
||||||
|
| GoDaddy | GD_Key, GD_Secret |
|
||||||
|
| NameSilo | Namesilo_Key |
|
||||||
|
| Namecheap | Namecheap_ApiKey |
|
||||||
|
| DNSPod | DP_Id, DP_Key |
|
||||||
|
| AWS Route53 | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY |
|
||||||
|
| Google Cloud | GCP_PROJECT |
|
||||||
|
| Azure DNS | AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET |
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
1. 启动服务:`./scripts/start-ssl-manager.sh start`
|
||||||
|
2. 访问 http://localhost:3000
|
||||||
|
3. 在"申请新证书"页面填写域名
|
||||||
|
4. 选择验证方式,查看自动生成的 DNS 配置指南
|
||||||
|
5. 提交申请,等待证书签发
|
||||||
|
|
||||||
|
## 📋 DNS 配置指南
|
||||||
|
|
||||||
|
不管你的域名在哪里注册(阿里云、腾讯云、Cloudflare、GoDaddy 等),在申请证书时会自动展示:
|
||||||
|
|
||||||
|
- **需要的 DNS 记录**(主机记录、类型、记录值、TTL)
|
||||||
|
- **配置步骤**(一步步指导)
|
||||||
|
- **服务商控制台位置**(快速跳转)
|
||||||
|
- **API 凭证说明**(如何获取)
|
||||||
|
|
||||||
|
详见:[DNS_GUIDE.md](DNS_GUIDE.md)
|
||||||
|
|
||||||
|
## 📁 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
ssl-manager/
|
||||||
|
├── backend/
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── routes/ # API 路由
|
||||||
|
│ │ ├── services/ # 业务逻辑
|
||||||
|
│ │ ├── utils/ # 工具函数
|
||||||
|
│ │ └── index.js # 入口文件
|
||||||
|
│ ├── data/ # SQLite 数据库
|
||||||
|
│ └── .env # 环境配置
|
||||||
|
├── frontend/
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── views/ # 页面组件
|
||||||
|
│ │ ├── components/ # 通用组件
|
||||||
|
│ │ ├── api/ # API 客户端
|
||||||
|
│ │ ├── stores/ # 状态管理
|
||||||
|
│ │ └── router/ # 路由配置
|
||||||
|
│ └── dist/ # 构建输出
|
||||||
|
├── scripts/
|
||||||
|
│ └── auto-renew.sh # 自动续期脚本
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔒 安全建议
|
||||||
|
|
||||||
|
1. **HTTPS 访问** - 生产环境务必使用 HTTPS
|
||||||
|
2. **防火墙** - 仅开放必要端口
|
||||||
|
3. **权限控制** - 限制 acme.sh 的执行权限
|
||||||
|
4. **凭证加密** - DNS API 密钥加密存储
|
||||||
|
5. **定期备份** - 备份证书和数据库
|
||||||
|
|
||||||
|
## 🐛 常见问题
|
||||||
|
|
||||||
|
### Q: 证书申请失败?
|
||||||
|
A: 检查域名 DNS 解析是否正确,确保服务器可访问 80 端口(HTTP-01)或 DNS API 凭证正确(DNS-01)。
|
||||||
|
|
||||||
|
### Q: 不知道域名在哪里注册?
|
||||||
|
A: 使用 `whois 你的域名` 命令查询,或在 SSL Manager 的 DNS 配置指南中查看各服务商的控制台链接。
|
||||||
|
|
||||||
|
### Q: DNS 记录添加后多久生效?
|
||||||
|
A: 通常 1-10 分钟,取决于 TTL 设置和 DNS 服务商。
|
||||||
|
|
||||||
|
### Q: 自动续期不工作?
|
||||||
|
A: 检查 cron 服务是否运行,查看日志 `/var/log/ssl-manager/renew.log`。
|
||||||
|
|
||||||
|
### Q: 如何添加更多 DNS 服务商?
|
||||||
|
A: 编辑 `backend/src/services/acme-service.js` 中的 `DNS_PROVIDERS` 对象。
|
||||||
|
|
||||||
|
## 📝 License
|
||||||
|
|
||||||
|
MIT
|
||||||
|
|
||||||
|
## 🙏 致谢
|
||||||
|
|
||||||
|
- [acme.sh](https://github.com/acmesh-official/acme.sh) - ACME 客户端
|
||||||
|
- [Let's Encrypt](https://letsencrypt.org/) - 免费 SSL 证书
|
||||||
|
- [Vue.js](https://vuejs.org/) - 前端框架
|
||||||
|
- [Element Plus](https://element-plus.org/) - UI 组件库
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**开发**: 小弟 👋
|
||||||
|
**日期**: 2026-04-07
|
||||||
+155
@@ -0,0 +1,155 @@
|
|||||||
|
# 🔧 SSL Manager 服务管理指南
|
||||||
|
|
||||||
|
## 📋 启动方式
|
||||||
|
|
||||||
|
### 方式一:systemd 服务(推荐,开机自启)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动服务
|
||||||
|
sudo systemctl start ssl-manager
|
||||||
|
|
||||||
|
# 停止服务
|
||||||
|
sudo systemctl stop ssl-manager
|
||||||
|
|
||||||
|
# 重启服务
|
||||||
|
sudo systemctl restart ssl-manager
|
||||||
|
|
||||||
|
# 查看状态
|
||||||
|
sudo systemctl status ssl-manager
|
||||||
|
|
||||||
|
# 开机自启
|
||||||
|
sudo systemctl enable ssl-manager
|
||||||
|
|
||||||
|
# 取消开机自启
|
||||||
|
sudo systemctl disable ssl-manager
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
sudo journalctl -u ssl-manager -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二:启动脚本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/ssl-manager
|
||||||
|
|
||||||
|
# 启动
|
||||||
|
./scripts/start-ssl-manager.sh start
|
||||||
|
|
||||||
|
# 停止
|
||||||
|
./scripts/start-ssl-manager.sh stop
|
||||||
|
|
||||||
|
# 重启
|
||||||
|
./scripts/start-ssl-manager.sh restart
|
||||||
|
|
||||||
|
# 查看状态
|
||||||
|
./scripts/start-ssl-manager.sh status
|
||||||
|
|
||||||
|
# 查看日志(实时)
|
||||||
|
./scripts/start-ssl-manager.sh logs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式三:手动启动(开发调试用)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/ssl-manager/backend
|
||||||
|
node src/index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🌐 访问地址
|
||||||
|
|
||||||
|
服务启动后访问:**http://localhost:3000**
|
||||||
|
|
||||||
|
## 📝 日志位置
|
||||||
|
|
||||||
|
- **systemd 日志**: `journalctl -u ssl-manager -f`
|
||||||
|
- **应用日志**: `/var/log/ssl-manager/backend.log`
|
||||||
|
|
||||||
|
## 🔍 故障排查
|
||||||
|
|
||||||
|
### 服务启动失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看 systemd 日志
|
||||||
|
sudo journalctl -u ssl-manager --since "10 minutes ago"
|
||||||
|
|
||||||
|
# 查看应用日志
|
||||||
|
tail -100 /var/log/ssl-manager/backend.log
|
||||||
|
|
||||||
|
# 检查端口占用
|
||||||
|
netstat -tlnp | grep 3000
|
||||||
|
|
||||||
|
# 检查 Node.js
|
||||||
|
node --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### 证书申请失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看 acme.sh 日志
|
||||||
|
tail -50 /root/.acme.sh/acme.sh.log
|
||||||
|
|
||||||
|
# 手动测试 acme.sh
|
||||||
|
/root/.acme.sh/acme.sh --issue --dns tencent -d "example.com" --server letsencrypt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 重启服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 方式 1
|
||||||
|
sudo systemctl restart ssl-manager
|
||||||
|
|
||||||
|
# 方式 2
|
||||||
|
./scripts/start-ssl-manager.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 服务状态检查清单
|
||||||
|
|
||||||
|
- [ ] 服务运行中:`systemctl status ssl-manager`
|
||||||
|
- [ ] 端口监听:`netstat -tlnp | grep 3000`
|
||||||
|
- [ ] 健康检查:`curl http://localhost:3000/api/health`
|
||||||
|
- [ ] 日志正常:`tail -20 /var/log/ssl-manager/backend.log`
|
||||||
|
|
||||||
|
## 🔐 安全建议
|
||||||
|
|
||||||
|
1. **防火墙配置**
|
||||||
|
```bash
|
||||||
|
# 仅允许本地访问(如果需要外网访问,开放 3000 端口)
|
||||||
|
sudo ufw allow 3000/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **HTTPS 配置**
|
||||||
|
- 生产环境建议在前端加一层 nginx 反向代理并配置 HTTPS
|
||||||
|
- 使用本工具申请的证书来加密管理界面
|
||||||
|
|
||||||
|
3. **定期更新**
|
||||||
|
```bash
|
||||||
|
# 更新 acme.sh
|
||||||
|
/root/.acme.sh/acme.sh --upgrade
|
||||||
|
|
||||||
|
# 更新项目代码
|
||||||
|
cd /root/.openclaw/workspace/ssl-manager
|
||||||
|
git pull # 如果有版本控制
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📞 常用命令速查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 一键重启
|
||||||
|
sudo systemctl restart ssl-manager
|
||||||
|
|
||||||
|
# 查看实时日志
|
||||||
|
sudo journalctl -u ssl-manager -f
|
||||||
|
|
||||||
|
# 检查服务是否正常
|
||||||
|
curl http://localhost:3000/api/health
|
||||||
|
|
||||||
|
# 停止服务
|
||||||
|
sudo systemctl stop ssl-manager
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
sudo systemctl start ssl-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**提示**: 推荐使用 systemd 方式,可以开机自启、自动重启、日志统一管理。
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# 服务配置
|
||||||
|
PORT=3000
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# ACME 配置
|
||||||
|
ACME_PATH=/root/.acme.sh
|
||||||
|
CERT_DIR=/etc/ssl/certs
|
||||||
|
ACME_EMAIL=your-email@example.com
|
||||||
|
|
||||||
|
# 加密密钥(用于存储 DNS 凭证)
|
||||||
|
# 生成方法:openssl rand -hex 32
|
||||||
|
ENCRYPTION_KEY=3c47e86c447ec9adab144557cc30a36d8a76440b93e614e22750070cf898a1a2
|
||||||
|
|
||||||
|
# 自动续期配置
|
||||||
|
AUTO_RENEW_ENABLED=true
|
||||||
|
AUTO_RENEW_CRON=0 0 * * *
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# 服务配置
|
||||||
|
PORT=3000
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# ACME 配置
|
||||||
|
ACME_PATH=/root/.acme.sh
|
||||||
|
CERT_DIR=/etc/ssl/certs
|
||||||
|
ACME_EMAIL=your-email@example.com
|
||||||
|
|
||||||
|
# 加密密钥(用于存储 DNS 凭证)
|
||||||
|
# 生成方法:openssl rand -hex 32
|
||||||
|
ENCRYPTION_KEY=your-32-character-secret-key-here
|
||||||
|
|
||||||
|
# 自动续期配置
|
||||||
|
AUTO_RENEW_ENABLED=true
|
||||||
|
AUTO_RENEW_CRON=0 0 * * *
|
||||||
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
../mime/cli.js
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../prebuild-install/bin.js
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../rc/cli.js
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../semver/bin/semver.js
|
||||||
+1301
File diff suppressed because it is too large
Load Diff
+243
@@ -0,0 +1,243 @@
|
|||||||
|
1.3.8 / 2022-02-02
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.34
|
||||||
|
- deps: mime-db@~1.51.0
|
||||||
|
* deps: negotiator@0.6.3
|
||||||
|
|
||||||
|
1.3.7 / 2019-04-29
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.6.2
|
||||||
|
- Fix sorting charset, encoding, and language with extra parameters
|
||||||
|
|
||||||
|
1.3.6 / 2019-04-28
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.24
|
||||||
|
- deps: mime-db@~1.40.0
|
||||||
|
|
||||||
|
1.3.5 / 2018-02-28
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.18
|
||||||
|
- deps: mime-db@~1.33.0
|
||||||
|
|
||||||
|
1.3.4 / 2017-08-22
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.16
|
||||||
|
- deps: mime-db@~1.29.0
|
||||||
|
|
||||||
|
1.3.3 / 2016-05-02
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.11
|
||||||
|
- deps: mime-db@~1.23.0
|
||||||
|
* deps: negotiator@0.6.1
|
||||||
|
- perf: improve `Accept` parsing speed
|
||||||
|
- perf: improve `Accept-Charset` parsing speed
|
||||||
|
- perf: improve `Accept-Encoding` parsing speed
|
||||||
|
- perf: improve `Accept-Language` parsing speed
|
||||||
|
|
||||||
|
1.3.2 / 2016-03-08
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.10
|
||||||
|
- Fix extension of `application/dash+xml`
|
||||||
|
- Update primary extension for `audio/mp4`
|
||||||
|
- deps: mime-db@~1.22.0
|
||||||
|
|
||||||
|
1.3.1 / 2016-01-19
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.9
|
||||||
|
- deps: mime-db@~1.21.0
|
||||||
|
|
||||||
|
1.3.0 / 2015-09-29
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.7
|
||||||
|
- deps: mime-db@~1.19.0
|
||||||
|
* deps: negotiator@0.6.0
|
||||||
|
- Fix including type extensions in parameters in `Accept` parsing
|
||||||
|
- Fix parsing `Accept` parameters with quoted equals
|
||||||
|
- Fix parsing `Accept` parameters with quoted semicolons
|
||||||
|
- Lazy-load modules from main entry point
|
||||||
|
- perf: delay type concatenation until needed
|
||||||
|
- perf: enable strict mode
|
||||||
|
- perf: hoist regular expressions
|
||||||
|
- perf: remove closures getting spec properties
|
||||||
|
- perf: remove a closure from media type parsing
|
||||||
|
- perf: remove property delete from media type parsing
|
||||||
|
|
||||||
|
1.2.13 / 2015-09-06
|
||||||
|
===================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.6
|
||||||
|
- deps: mime-db@~1.18.0
|
||||||
|
|
||||||
|
1.2.12 / 2015-07-30
|
||||||
|
===================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.4
|
||||||
|
- deps: mime-db@~1.16.0
|
||||||
|
|
||||||
|
1.2.11 / 2015-07-16
|
||||||
|
===================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.3
|
||||||
|
- deps: mime-db@~1.15.0
|
||||||
|
|
||||||
|
1.2.10 / 2015-07-01
|
||||||
|
===================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.2
|
||||||
|
- deps: mime-db@~1.14.0
|
||||||
|
|
||||||
|
1.2.9 / 2015-06-08
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.1
|
||||||
|
- perf: fix deopt during mapping
|
||||||
|
|
||||||
|
1.2.8 / 2015-06-07
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.1.0
|
||||||
|
- deps: mime-db@~1.13.0
|
||||||
|
* perf: avoid argument reassignment & argument slice
|
||||||
|
* perf: avoid negotiator recursive construction
|
||||||
|
* perf: enable strict mode
|
||||||
|
* perf: remove unnecessary bitwise operator
|
||||||
|
|
||||||
|
1.2.7 / 2015-05-10
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.5.3
|
||||||
|
- Fix media type parameter matching to be case-insensitive
|
||||||
|
|
||||||
|
1.2.6 / 2015-05-07
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.11
|
||||||
|
- deps: mime-db@~1.9.1
|
||||||
|
* deps: negotiator@0.5.2
|
||||||
|
- Fix comparing media types with quoted values
|
||||||
|
- Fix splitting media types with quoted commas
|
||||||
|
|
||||||
|
1.2.5 / 2015-03-13
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.10
|
||||||
|
- deps: mime-db@~1.8.0
|
||||||
|
|
||||||
|
1.2.4 / 2015-02-14
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Support Node.js 0.6
|
||||||
|
* deps: mime-types@~2.0.9
|
||||||
|
- deps: mime-db@~1.7.0
|
||||||
|
* deps: negotiator@0.5.1
|
||||||
|
- Fix preference sorting to be stable for long acceptable lists
|
||||||
|
|
||||||
|
1.2.3 / 2015-01-31
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.8
|
||||||
|
- deps: mime-db@~1.6.0
|
||||||
|
|
||||||
|
1.2.2 / 2014-12-30
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.7
|
||||||
|
- deps: mime-db@~1.5.0
|
||||||
|
|
||||||
|
1.2.1 / 2014-12-30
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.5
|
||||||
|
- deps: mime-db@~1.3.1
|
||||||
|
|
||||||
|
1.2.0 / 2014-12-19
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.5.0
|
||||||
|
- Fix list return order when large accepted list
|
||||||
|
- Fix missing identity encoding when q=0 exists
|
||||||
|
- Remove dynamic building of Negotiator class
|
||||||
|
|
||||||
|
1.1.4 / 2014-12-10
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.4
|
||||||
|
- deps: mime-db@~1.3.0
|
||||||
|
|
||||||
|
1.1.3 / 2014-11-09
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.3
|
||||||
|
- deps: mime-db@~1.2.0
|
||||||
|
|
||||||
|
1.1.2 / 2014-10-14
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.4.9
|
||||||
|
- Fix error when media type has invalid parameter
|
||||||
|
|
||||||
|
1.1.1 / 2014-09-28
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: mime-types@~2.0.2
|
||||||
|
- deps: mime-db@~1.1.0
|
||||||
|
* deps: negotiator@0.4.8
|
||||||
|
- Fix all negotiations to be case-insensitive
|
||||||
|
- Stable sort preferences of same quality according to client order
|
||||||
|
|
||||||
|
1.1.0 / 2014-09-02
|
||||||
|
==================
|
||||||
|
|
||||||
|
* update `mime-types`
|
||||||
|
|
||||||
|
1.0.7 / 2014-07-04
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Fix wrong type returned from `type` when match after unknown extension
|
||||||
|
|
||||||
|
1.0.6 / 2014-06-24
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.4.7
|
||||||
|
|
||||||
|
1.0.5 / 2014-06-20
|
||||||
|
==================
|
||||||
|
|
||||||
|
* fix crash when unknown extension given
|
||||||
|
|
||||||
|
1.0.4 / 2014-06-19
|
||||||
|
==================
|
||||||
|
|
||||||
|
* use `mime-types`
|
||||||
|
|
||||||
|
1.0.3 / 2014-06-11
|
||||||
|
==================
|
||||||
|
|
||||||
|
* deps: negotiator@0.4.6
|
||||||
|
- Order by specificity when quality is the same
|
||||||
|
|
||||||
|
1.0.2 / 2014-05-29
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Fix interpretation when header not in request
|
||||||
|
* deps: pin negotiator@0.4.5
|
||||||
|
|
||||||
|
1.0.1 / 2014-01-18
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Identity encoding isn't always acceptable
|
||||||
|
* deps: negotiator@~0.4.0
|
||||||
|
|
||||||
|
1.0.0 / 2013-12-27
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Genesis
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
||||||
|
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
+140
@@ -0,0 +1,140 @@
|
|||||||
|
# accepts
|
||||||
|
|
||||||
|
[![NPM Version][npm-version-image]][npm-url]
|
||||||
|
[![NPM Downloads][npm-downloads-image]][npm-url]
|
||||||
|
[![Node.js Version][node-version-image]][node-version-url]
|
||||||
|
[![Build Status][github-actions-ci-image]][github-actions-ci-url]
|
||||||
|
[![Test Coverage][coveralls-image]][coveralls-url]
|
||||||
|
|
||||||
|
Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
|
||||||
|
Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
|
||||||
|
|
||||||
|
In addition to negotiator, it allows:
|
||||||
|
|
||||||
|
- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
|
||||||
|
as well as `('text/html', 'application/json')`.
|
||||||
|
- Allows type shorthands such as `json`.
|
||||||
|
- Returns `false` when no types match
|
||||||
|
- Treats non-existent headers as `*`
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
This is a [Node.js](https://nodejs.org/en/) module available through the
|
||||||
|
[npm registry](https://www.npmjs.com/). Installation is done using the
|
||||||
|
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm install accepts
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
```js
|
||||||
|
var accepts = require('accepts')
|
||||||
|
```
|
||||||
|
|
||||||
|
### accepts(req)
|
||||||
|
|
||||||
|
Create a new `Accepts` object for the given `req`.
|
||||||
|
|
||||||
|
#### .charset(charsets)
|
||||||
|
|
||||||
|
Return the first accepted charset. If nothing in `charsets` is accepted,
|
||||||
|
then `false` is returned.
|
||||||
|
|
||||||
|
#### .charsets()
|
||||||
|
|
||||||
|
Return the charsets that the request accepts, in the order of the client's
|
||||||
|
preference (most preferred first).
|
||||||
|
|
||||||
|
#### .encoding(encodings)
|
||||||
|
|
||||||
|
Return the first accepted encoding. If nothing in `encodings` is accepted,
|
||||||
|
then `false` is returned.
|
||||||
|
|
||||||
|
#### .encodings()
|
||||||
|
|
||||||
|
Return the encodings that the request accepts, in the order of the client's
|
||||||
|
preference (most preferred first).
|
||||||
|
|
||||||
|
#### .language(languages)
|
||||||
|
|
||||||
|
Return the first accepted language. If nothing in `languages` is accepted,
|
||||||
|
then `false` is returned.
|
||||||
|
|
||||||
|
#### .languages()
|
||||||
|
|
||||||
|
Return the languages that the request accepts, in the order of the client's
|
||||||
|
preference (most preferred first).
|
||||||
|
|
||||||
|
#### .type(types)
|
||||||
|
|
||||||
|
Return the first accepted type (and it is returned as the same text as what
|
||||||
|
appears in the `types` array). If nothing in `types` is accepted, then `false`
|
||||||
|
is returned.
|
||||||
|
|
||||||
|
The `types` array can contain full MIME types or file extensions. Any value
|
||||||
|
that is not a full MIME types is passed to `require('mime-types').lookup`.
|
||||||
|
|
||||||
|
#### .types()
|
||||||
|
|
||||||
|
Return the types that the request accepts, in the order of the client's
|
||||||
|
preference (most preferred first).
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Simple type negotiation
|
||||||
|
|
||||||
|
This simple example shows how to use `accepts` to return a different typed
|
||||||
|
respond body based on what the client wants to accept. The server lists it's
|
||||||
|
preferences in order and will get back the best match between the client and
|
||||||
|
server.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var accepts = require('accepts')
|
||||||
|
var http = require('http')
|
||||||
|
|
||||||
|
function app (req, res) {
|
||||||
|
var accept = accepts(req)
|
||||||
|
|
||||||
|
// the order of this list is significant; should be server preferred order
|
||||||
|
switch (accept.type(['json', 'html'])) {
|
||||||
|
case 'json':
|
||||||
|
res.setHeader('Content-Type', 'application/json')
|
||||||
|
res.write('{"hello":"world!"}')
|
||||||
|
break
|
||||||
|
case 'html':
|
||||||
|
res.setHeader('Content-Type', 'text/html')
|
||||||
|
res.write('<b>hello, world!</b>')
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
// the fallback is text/plain, so no need to specify it above
|
||||||
|
res.setHeader('Content-Type', 'text/plain')
|
||||||
|
res.write('hello, world!')
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
res.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
http.createServer(app).listen(3000)
|
||||||
|
```
|
||||||
|
|
||||||
|
You can test this out with the cURL program:
|
||||||
|
```sh
|
||||||
|
curl -I -H'Accept: text/html' http://localhost:3000/
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
||||||
|
|
||||||
|
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
|
||||||
|
[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
|
||||||
|
[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci
|
||||||
|
[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml
|
||||||
|
[node-version-image]: https://badgen.net/npm/node/accepts
|
||||||
|
[node-version-url]: https://nodejs.org/en/download
|
||||||
|
[npm-downloads-image]: https://badgen.net/npm/dm/accepts
|
||||||
|
[npm-url]: https://npmjs.org/package/accepts
|
||||||
|
[npm-version-image]: https://badgen.net/npm/v/accepts
|
||||||
+238
@@ -0,0 +1,238 @@
|
|||||||
|
/*!
|
||||||
|
* accepts
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Negotiator = require('negotiator')
|
||||||
|
var mime = require('mime-types')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Accepts
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new Accepts object for the given req.
|
||||||
|
*
|
||||||
|
* @param {object} req
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Accepts (req) {
|
||||||
|
if (!(this instanceof Accepts)) {
|
||||||
|
return new Accepts(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.headers = req.headers
|
||||||
|
this.negotiator = new Negotiator(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given `type(s)` is acceptable, returning
|
||||||
|
* the best match when true, otherwise `undefined`, in which
|
||||||
|
* case you should respond with 406 "Not Acceptable".
|
||||||
|
*
|
||||||
|
* The `type` value may be a single mime type string
|
||||||
|
* such as "application/json", the extension name
|
||||||
|
* such as "json" or an array `["json", "html", "text/plain"]`. When a list
|
||||||
|
* or array is given the _best_ match, if any is returned.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* // Accept: text/html
|
||||||
|
* this.types('html');
|
||||||
|
* // => "html"
|
||||||
|
*
|
||||||
|
* // Accept: text/*, application/json
|
||||||
|
* this.types('html');
|
||||||
|
* // => "html"
|
||||||
|
* this.types('text/html');
|
||||||
|
* // => "text/html"
|
||||||
|
* this.types('json', 'text');
|
||||||
|
* // => "json"
|
||||||
|
* this.types('application/json');
|
||||||
|
* // => "application/json"
|
||||||
|
*
|
||||||
|
* // Accept: text/*, application/json
|
||||||
|
* this.types('image/png');
|
||||||
|
* this.types('png');
|
||||||
|
* // => undefined
|
||||||
|
*
|
||||||
|
* // Accept: text/*;q=.5, application/json
|
||||||
|
* this.types(['html', 'json']);
|
||||||
|
* this.types('html', 'json');
|
||||||
|
* // => "json"
|
||||||
|
*
|
||||||
|
* @param {String|Array} types...
|
||||||
|
* @return {String|Array|Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Accepts.prototype.type =
|
||||||
|
Accepts.prototype.types = function (types_) {
|
||||||
|
var types = types_
|
||||||
|
|
||||||
|
// support flattened arguments
|
||||||
|
if (types && !Array.isArray(types)) {
|
||||||
|
types = new Array(arguments.length)
|
||||||
|
for (var i = 0; i < types.length; i++) {
|
||||||
|
types[i] = arguments[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no types, return all requested types
|
||||||
|
if (!types || types.length === 0) {
|
||||||
|
return this.negotiator.mediaTypes()
|
||||||
|
}
|
||||||
|
|
||||||
|
// no accept header, return first given type
|
||||||
|
if (!this.headers.accept) {
|
||||||
|
return types[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
var mimes = types.map(extToMime)
|
||||||
|
var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
|
||||||
|
var first = accepts[0]
|
||||||
|
|
||||||
|
return first
|
||||||
|
? types[mimes.indexOf(first)]
|
||||||
|
: false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return accepted encodings or best fit based on `encodings`.
|
||||||
|
*
|
||||||
|
* Given `Accept-Encoding: gzip, deflate`
|
||||||
|
* an array sorted by quality is returned:
|
||||||
|
*
|
||||||
|
* ['gzip', 'deflate']
|
||||||
|
*
|
||||||
|
* @param {String|Array} encodings...
|
||||||
|
* @return {String|Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Accepts.prototype.encoding =
|
||||||
|
Accepts.prototype.encodings = function (encodings_) {
|
||||||
|
var encodings = encodings_
|
||||||
|
|
||||||
|
// support flattened arguments
|
||||||
|
if (encodings && !Array.isArray(encodings)) {
|
||||||
|
encodings = new Array(arguments.length)
|
||||||
|
for (var i = 0; i < encodings.length; i++) {
|
||||||
|
encodings[i] = arguments[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no encodings, return all requested encodings
|
||||||
|
if (!encodings || encodings.length === 0) {
|
||||||
|
return this.negotiator.encodings()
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.negotiator.encodings(encodings)[0] || false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return accepted charsets or best fit based on `charsets`.
|
||||||
|
*
|
||||||
|
* Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
|
||||||
|
* an array sorted by quality is returned:
|
||||||
|
*
|
||||||
|
* ['utf-8', 'utf-7', 'iso-8859-1']
|
||||||
|
*
|
||||||
|
* @param {String|Array} charsets...
|
||||||
|
* @return {String|Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Accepts.prototype.charset =
|
||||||
|
Accepts.prototype.charsets = function (charsets_) {
|
||||||
|
var charsets = charsets_
|
||||||
|
|
||||||
|
// support flattened arguments
|
||||||
|
if (charsets && !Array.isArray(charsets)) {
|
||||||
|
charsets = new Array(arguments.length)
|
||||||
|
for (var i = 0; i < charsets.length; i++) {
|
||||||
|
charsets[i] = arguments[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no charsets, return all requested charsets
|
||||||
|
if (!charsets || charsets.length === 0) {
|
||||||
|
return this.negotiator.charsets()
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.negotiator.charsets(charsets)[0] || false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return accepted languages or best fit based on `langs`.
|
||||||
|
*
|
||||||
|
* Given `Accept-Language: en;q=0.8, es, pt`
|
||||||
|
* an array sorted by quality is returned:
|
||||||
|
*
|
||||||
|
* ['es', 'pt', 'en']
|
||||||
|
*
|
||||||
|
* @param {String|Array} langs...
|
||||||
|
* @return {Array|String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Accepts.prototype.lang =
|
||||||
|
Accepts.prototype.langs =
|
||||||
|
Accepts.prototype.language =
|
||||||
|
Accepts.prototype.languages = function (languages_) {
|
||||||
|
var languages = languages_
|
||||||
|
|
||||||
|
// support flattened arguments
|
||||||
|
if (languages && !Array.isArray(languages)) {
|
||||||
|
languages = new Array(arguments.length)
|
||||||
|
for (var i = 0; i < languages.length; i++) {
|
||||||
|
languages[i] = arguments[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no languages, return all requested languages
|
||||||
|
if (!languages || languages.length === 0) {
|
||||||
|
return this.negotiator.languages()
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.negotiator.languages(languages)[0] || false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert extnames to mime.
|
||||||
|
*
|
||||||
|
* @param {String} type
|
||||||
|
* @return {String}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function extToMime (type) {
|
||||||
|
return type.indexOf('/') === -1
|
||||||
|
? mime.lookup(type)
|
||||||
|
: type
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if mime is valid.
|
||||||
|
*
|
||||||
|
* @param {String} type
|
||||||
|
* @return {String}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function validMime (type) {
|
||||||
|
return typeof type === 'string'
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"name": "accepts",
|
||||||
|
"description": "Higher-level content negotiation",
|
||||||
|
"version": "1.3.8",
|
||||||
|
"contributors": [
|
||||||
|
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
||||||
|
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": "jshttp/accepts",
|
||||||
|
"dependencies": {
|
||||||
|
"mime-types": "~2.1.34",
|
||||||
|
"negotiator": "0.6.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"deep-equal": "1.0.1",
|
||||||
|
"eslint": "7.32.0",
|
||||||
|
"eslint-config-standard": "14.1.1",
|
||||||
|
"eslint-plugin-import": "2.25.4",
|
||||||
|
"eslint-plugin-markdown": "2.2.1",
|
||||||
|
"eslint-plugin-node": "11.1.0",
|
||||||
|
"eslint-plugin-promise": "4.3.1",
|
||||||
|
"eslint-plugin-standard": "4.1.0",
|
||||||
|
"mocha": "9.2.0",
|
||||||
|
"nyc": "15.1.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"LICENSE",
|
||||||
|
"HISTORY.md",
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"lint": "eslint .",
|
||||||
|
"test": "mocha --reporter spec --check-leaks --bail test/",
|
||||||
|
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
||||||
|
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"content",
|
||||||
|
"negotiation",
|
||||||
|
"accept",
|
||||||
|
"accepts"
|
||||||
|
]
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
# Array Flatten
|
||||||
|
|
||||||
|
[![NPM version][npm-image]][npm-url]
|
||||||
|
[![NPM downloads][downloads-image]][downloads-url]
|
||||||
|
[![Build status][travis-image]][travis-url]
|
||||||
|
[![Test coverage][coveralls-image]][coveralls-url]
|
||||||
|
|
||||||
|
> Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install array-flatten --save
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var flatten = require('array-flatten')
|
||||||
|
|
||||||
|
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
|
||||||
|
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||||
|
|
||||||
|
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
|
||||||
|
//=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
flatten(arguments) //=> [1, 2, 3]
|
||||||
|
})(1, [2, 3])
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
||||||
|
|
||||||
|
[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
|
||||||
|
[npm-url]: https://npmjs.org/package/array-flatten
|
||||||
|
[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
|
||||||
|
[downloads-url]: https://npmjs.org/package/array-flatten
|
||||||
|
[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
|
||||||
|
[travis-url]: https://travis-ci.org/blakeembrey/array-flatten
|
||||||
|
[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat
|
||||||
|
[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `arrayFlatten`.
|
||||||
|
*/
|
||||||
|
module.exports = arrayFlatten
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursive flatten function with depth.
|
||||||
|
*
|
||||||
|
* @param {Array} array
|
||||||
|
* @param {Array} result
|
||||||
|
* @param {Number} depth
|
||||||
|
* @return {Array}
|
||||||
|
*/
|
||||||
|
function flattenWithDepth (array, result, depth) {
|
||||||
|
for (var i = 0; i < array.length; i++) {
|
||||||
|
var value = array[i]
|
||||||
|
|
||||||
|
if (depth > 0 && Array.isArray(value)) {
|
||||||
|
flattenWithDepth(value, result, depth - 1)
|
||||||
|
} else {
|
||||||
|
result.push(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursive flatten function. Omitting depth is slightly faster.
|
||||||
|
*
|
||||||
|
* @param {Array} array
|
||||||
|
* @param {Array} result
|
||||||
|
* @return {Array}
|
||||||
|
*/
|
||||||
|
function flattenForever (array, result) {
|
||||||
|
for (var i = 0; i < array.length; i++) {
|
||||||
|
var value = array[i]
|
||||||
|
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
flattenForever(value, result)
|
||||||
|
} else {
|
||||||
|
result.push(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten an array, with the ability to define a depth.
|
||||||
|
*
|
||||||
|
* @param {Array} array
|
||||||
|
* @param {Number} depth
|
||||||
|
* @return {Array}
|
||||||
|
*/
|
||||||
|
function arrayFlatten (array, depth) {
|
||||||
|
if (depth == null) {
|
||||||
|
return flattenForever(array, [])
|
||||||
|
}
|
||||||
|
|
||||||
|
return flattenWithDepth(array, [], depth)
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"name": "array-flatten",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"description": "Flatten an array of nested arrays into a single flat array",
|
||||||
|
"main": "array-flatten.js",
|
||||||
|
"files": [
|
||||||
|
"array-flatten.js",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"test": "istanbul cover _mocha -- -R spec"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/blakeembrey/array-flatten.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"array",
|
||||||
|
"flatten",
|
||||||
|
"arguments",
|
||||||
|
"depth"
|
||||||
|
],
|
||||||
|
"author": {
|
||||||
|
"name": "Blake Embrey",
|
||||||
|
"email": "hello@blakeembrey.com",
|
||||||
|
"url": "http://blakeembrey.me"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/blakeembrey/array-flatten/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/blakeembrey/array-flatten",
|
||||||
|
"devDependencies": {
|
||||||
|
"istanbul": "^0.3.13",
|
||||||
|
"mocha": "^2.2.4",
|
||||||
|
"pre-commit": "^1.0.7",
|
||||||
|
"standard": "^3.7.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Jameson Little
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
base64-js
|
||||||
|
=========
|
||||||
|
|
||||||
|
`base64-js` does basic base64 encoding/decoding in pure JS.
|
||||||
|
|
||||||
|
[](http://travis-ci.org/beatgammit/base64-js)
|
||||||
|
|
||||||
|
Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.
|
||||||
|
|
||||||
|
Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does.
|
||||||
|
|
||||||
|
## install
|
||||||
|
|
||||||
|
With [npm](https://npmjs.org) do:
|
||||||
|
|
||||||
|
`npm install base64-js` and `var base64js = require('base64-js')`
|
||||||
|
|
||||||
|
For use in web browsers do:
|
||||||
|
|
||||||
|
`<script src="base64js.min.js"></script>`
|
||||||
|
|
||||||
|
[Get supported base64-js with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-base64-js?utm_source=npm-base64-js&utm_medium=referral&utm_campaign=readme)
|
||||||
|
|
||||||
|
## methods
|
||||||
|
|
||||||
|
`base64js` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument.
|
||||||
|
|
||||||
|
* `byteLength` - Takes a base64 string and returns length of byte array
|
||||||
|
* `toByteArray` - Takes a base64 string and returns a byte array
|
||||||
|
* `fromByteArray` - Takes a byte array and returns a base64 string
|
||||||
|
|
||||||
|
## license
|
||||||
|
|
||||||
|
MIT
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
(function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,b.base64js=a()}})(function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){'use strict';function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],h=f[1],j=new m(e(a,g,h)),k=0,n=0<h?g-4:g;for(c=0;c<n;c+=4)b=l[a.charCodeAt(c)]<<18|l[a.charCodeAt(c+1)]<<12|l[a.charCodeAt(c+2)]<<6|l[a.charCodeAt(c+3)],j[k++]=255&b>>16,j[k++]=255&b>>8,j[k++]=255&b;return 2===h&&(b=l[a.charCodeAt(c)]<<2|l[a.charCodeAt(c+1)]>>4,j[k++]=255&b),1===h&&(b=l[a.charCodeAt(c)]<<10|l[a.charCodeAt(c+1)]<<4|l[a.charCodeAt(c+2)]>>2,j[k++]=255&b>>8,j[k++]=255&b),j}function g(a){return k[63&a>>18]+k[63&a>>12]+k[63&a>>6]+k[63&a]}function h(a,b,c){for(var d,e=[],f=b;f<c;f+=3)d=(16711680&a[f]<<16)+(65280&a[f+1]<<8)+(255&a[f+2]),e.push(g(d));return e.join("")}function j(a){for(var b,c=a.length,d=c%3,e=[],f=16383,g=0,j=c-d;g<j;g+=f)e.push(h(a,g,g+f>j?j:g+f));return 1===d?(b=a[c-1],e.push(k[b>>2]+k[63&b<<4]+"==")):2===d&&(b=(a[c-2]<<8)+a[c-1],e.push(k[b>>10]+k[63&b>>4]+k[63&b<<2]+"=")),e.join("")}c.byteLength=function(a){var b=d(a),c=b[0],e=b[1];return 3*(c+e)/4-e},c.toByteArray=f,c.fromByteArray=j;for(var k=[],l=[],m="undefined"==typeof Uint8Array?Array:Uint8Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,p=n.length;o<p;++o)k[o]=n[o],l[n.charCodeAt(o)]=o;l[45]=62,l[95]=63},{}]},{},[])("/")});
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
export function byteLength(b64: string): number;
|
||||||
|
export function toByteArray(b64: string): Uint8Array;
|
||||||
|
export function fromByteArray(uint8: Uint8Array): string;
|
||||||
+150
@@ -0,0 +1,150 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
exports.byteLength = byteLength
|
||||||
|
exports.toByteArray = toByteArray
|
||||||
|
exports.fromByteArray = fromByteArray
|
||||||
|
|
||||||
|
var lookup = []
|
||||||
|
var revLookup = []
|
||||||
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
||||||
|
|
||||||
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||||
|
for (var i = 0, len = code.length; i < len; ++i) {
|
||||||
|
lookup[i] = code[i]
|
||||||
|
revLookup[code.charCodeAt(i)] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support decoding URL-safe base64 strings, as Node.js does.
|
||||||
|
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
||||||
|
revLookup['-'.charCodeAt(0)] = 62
|
||||||
|
revLookup['_'.charCodeAt(0)] = 63
|
||||||
|
|
||||||
|
function getLens (b64) {
|
||||||
|
var len = b64.length
|
||||||
|
|
||||||
|
if (len % 4 > 0) {
|
||||||
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim off extra bytes after placeholder bytes are found
|
||||||
|
// See: https://github.com/beatgammit/base64-js/issues/42
|
||||||
|
var validLen = b64.indexOf('=')
|
||||||
|
if (validLen === -1) validLen = len
|
||||||
|
|
||||||
|
var placeHoldersLen = validLen === len
|
||||||
|
? 0
|
||||||
|
: 4 - (validLen % 4)
|
||||||
|
|
||||||
|
return [validLen, placeHoldersLen]
|
||||||
|
}
|
||||||
|
|
||||||
|
// base64 is 4/3 + up to two characters of the original data
|
||||||
|
function byteLength (b64) {
|
||||||
|
var lens = getLens(b64)
|
||||||
|
var validLen = lens[0]
|
||||||
|
var placeHoldersLen = lens[1]
|
||||||
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||||||
|
}
|
||||||
|
|
||||||
|
function _byteLength (b64, validLen, placeHoldersLen) {
|
||||||
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||||||
|
}
|
||||||
|
|
||||||
|
function toByteArray (b64) {
|
||||||
|
var tmp
|
||||||
|
var lens = getLens(b64)
|
||||||
|
var validLen = lens[0]
|
||||||
|
var placeHoldersLen = lens[1]
|
||||||
|
|
||||||
|
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
||||||
|
|
||||||
|
var curByte = 0
|
||||||
|
|
||||||
|
// if there are placeholders, only get up to the last complete 4 chars
|
||||||
|
var len = placeHoldersLen > 0
|
||||||
|
? validLen - 4
|
||||||
|
: validLen
|
||||||
|
|
||||||
|
var i
|
||||||
|
for (i = 0; i < len; i += 4) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 18) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
||||||
|
revLookup[b64.charCodeAt(i + 3)]
|
||||||
|
arr[curByte++] = (tmp >> 16) & 0xFF
|
||||||
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placeHoldersLen === 2) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 2) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placeHoldersLen === 1) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 10) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
||||||
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
function tripletToBase64 (num) {
|
||||||
|
return lookup[num >> 18 & 0x3F] +
|
||||||
|
lookup[num >> 12 & 0x3F] +
|
||||||
|
lookup[num >> 6 & 0x3F] +
|
||||||
|
lookup[num & 0x3F]
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodeChunk (uint8, start, end) {
|
||||||
|
var tmp
|
||||||
|
var output = []
|
||||||
|
for (var i = start; i < end; i += 3) {
|
||||||
|
tmp =
|
||||||
|
((uint8[i] << 16) & 0xFF0000) +
|
||||||
|
((uint8[i + 1] << 8) & 0xFF00) +
|
||||||
|
(uint8[i + 2] & 0xFF)
|
||||||
|
output.push(tripletToBase64(tmp))
|
||||||
|
}
|
||||||
|
return output.join('')
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromByteArray (uint8) {
|
||||||
|
var tmp
|
||||||
|
var len = uint8.length
|
||||||
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
||||||
|
var parts = []
|
||||||
|
var maxChunkLength = 16383 // must be multiple of 3
|
||||||
|
|
||||||
|
// go through the array every three bytes, we'll deal with trailing stuff later
|
||||||
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
||||||
|
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// pad the end with zeros, but make sure to not forget the extra bytes
|
||||||
|
if (extraBytes === 1) {
|
||||||
|
tmp = uint8[len - 1]
|
||||||
|
parts.push(
|
||||||
|
lookup[tmp >> 2] +
|
||||||
|
lookup[(tmp << 4) & 0x3F] +
|
||||||
|
'=='
|
||||||
|
)
|
||||||
|
} else if (extraBytes === 2) {
|
||||||
|
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
||||||
|
parts.push(
|
||||||
|
lookup[tmp >> 10] +
|
||||||
|
lookup[(tmp >> 4) & 0x3F] +
|
||||||
|
lookup[(tmp << 2) & 0x3F] +
|
||||||
|
'='
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts.join('')
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"name": "base64-js",
|
||||||
|
"description": "Base64 encoding/decoding in pure JS",
|
||||||
|
"version": "1.5.1",
|
||||||
|
"author": "T. Jameson Little <t.jameson.little@gmail.com>",
|
||||||
|
"typings": "index.d.ts",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/beatgammit/base64-js/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-minify": "^0.5.1",
|
||||||
|
"benchmark": "^2.1.4",
|
||||||
|
"browserify": "^16.3.0",
|
||||||
|
"standard": "*",
|
||||||
|
"tape": "4.x"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/beatgammit/base64-js",
|
||||||
|
"keywords": [
|
||||||
|
"base64"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/beatgammit/base64-js.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "browserify -s base64js -r ./ | minify > base64js.min.js",
|
||||||
|
"lint": "standard",
|
||||||
|
"test": "npm run lint && npm run unit",
|
||||||
|
"unit": "tape test/*.js"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 Joshua Wise
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
# better-sqlite3 [](https://github.com/JoshuaWise/better-sqlite3/actions/workflows/build.yml?query=branch%3Amaster)
|
||||||
|
|
||||||
|
The fastest and simplest library for SQLite3 in Node.js.
|
||||||
|
|
||||||
|
- Full transaction support
|
||||||
|
- High performance, efficiency, and safety
|
||||||
|
- Easy-to-use synchronous API *(better concurrency than an asynchronous API... yes, you read that correctly)*
|
||||||
|
- Support for user-defined functions, aggregates, virtual tables, and extensions
|
||||||
|
- 64-bit integers *(invisible until you need them)*
|
||||||
|
- Worker thread support *(for large/slow queries)*
|
||||||
|
|
||||||
|
## Help this project stay strong! 💪
|
||||||
|
|
||||||
|
`better-sqlite3` is used by thousands of developers and engineers on a daily basis. Long nights and weekends were spent keeping this project strong and dependable, with no ask for compensation or funding, until now. If your company uses `better-sqlite3`, ask your manager to consider supporting the project:
|
||||||
|
|
||||||
|
- [Become a GitHub sponsor](https://github.com/sponsors/JoshuaWise)
|
||||||
|
- [Become a backer on Patreon](https://www.patreon.com/joshuawise)
|
||||||
|
- [Make a one-time donation on PayPal](https://www.paypal.me/joshuathomaswise)
|
||||||
|
|
||||||
|
## How other libraries compare
|
||||||
|
|
||||||
|
| |select 1 row `get()` |select 100 rows `all()` |select 100 rows `iterate()` 1-by-1|insert 1 row `run()`|insert 100 rows in a transaction|
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
|better-sqlite3|1x|1x|1x|1x|1x|
|
||||||
|
|[sqlite](https://www.npmjs.com/package/sqlite) and [sqlite3](https://www.npmjs.com/package/sqlite3)|11.7x slower|2.9x slower|24.4x slower|2.8x slower|15.6x slower|
|
||||||
|
|
||||||
|
> You can verify these results by [running the benchmark yourself](./docs/benchmark.md).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install better-sqlite3
|
||||||
|
```
|
||||||
|
|
||||||
|
> You must be using Node.js v14.21.1 or above. Prebuilt binaries are available for [LTS versions](https://nodejs.org/en/about/releases/). If you have trouble installing, check the [troubleshooting guide](./docs/troubleshooting.md).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```js
|
||||||
|
const db = require('better-sqlite3')('foobar.db', options);
|
||||||
|
|
||||||
|
const row = db.prepare('SELECT * FROM users WHERE id = ?').get(userId);
|
||||||
|
console.log(row.firstName, row.lastName, row.email);
|
||||||
|
```
|
||||||
|
|
||||||
|
Though not required, [it is generally important to set the WAL pragma for performance reasons](https://github.com/WiseLibs/better-sqlite3/blob/master/docs/performance.md).
|
||||||
|
|
||||||
|
```js
|
||||||
|
db.pragma('journal_mode = WAL');
|
||||||
|
```
|
||||||
|
|
||||||
|
##### In ES6 module notation:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import Database from 'better-sqlite3';
|
||||||
|
const db = new Database('foobar.db', options);
|
||||||
|
db.pragma('journal_mode = WAL');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Why should I use this instead of [node-sqlite3](https://github.com/mapbox/node-sqlite3)?
|
||||||
|
|
||||||
|
- `node-sqlite3` uses asynchronous APIs for tasks that are either CPU-bound or serialized. That's not only bad design, but it wastes tons of resources. It also causes [mutex thrashing](https://en.wikipedia.org/wiki/Resource_contention) which has devastating effects on performance.
|
||||||
|
- `node-sqlite3` exposes low-level (C language) memory management functions. `better-sqlite3` does it the JavaScript way, allowing the garbage collector to worry about memory management.
|
||||||
|
- `better-sqlite3` is simpler to use, and it provides nice utilities for some operations that are very difficult or impossible in `node-sqlite3`.
|
||||||
|
- `better-sqlite3` is much faster than `node-sqlite3` in most cases, and just as fast in all other cases.
|
||||||
|
|
||||||
|
#### When is this library not appropriate?
|
||||||
|
|
||||||
|
In most cases, if you're attempting something that cannot be reasonably accomplished with `better-sqlite3`, it probably cannot be reasonably accomplished with SQLite3 in general. For example, if you're executing queries that take one second to complete, and you expect to have many concurrent users executing those queries, no amount of asynchronicity will save you from SQLite3's serialized nature. Fortunately, SQLite3 is very *very* fast. With proper indexing, we've been able to achieve upward of 2000 queries per second with 5-way-joins in a 60 GB database, where each query was handling 5–50 kilobytes of real data.
|
||||||
|
|
||||||
|
If you have a performance problem, the most likely causes are inefficient queries, improper indexing, or a lack of [WAL mode](./docs/performance.md)—not `better-sqlite3` itself. However, there are some cases where `better-sqlite3` could be inappropriate:
|
||||||
|
|
||||||
|
- If you expect a high volume of concurrent reads each returning many megabytes of data (i.e., videos)
|
||||||
|
- If you expect a high volume of concurrent writes (i.e., a social media site)
|
||||||
|
- If your database's size is near the terabyte range
|
||||||
|
|
||||||
|
For these situations, you should probably use a full-fledged RDBMS such as [PostgreSQL](https://www.postgresql.org/).
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
- [API documentation](./docs/api.md)
|
||||||
|
- [Performance](./docs/performance.md) (also see [benchmark results](./docs/benchmark.md))
|
||||||
|
- [64-bit integer support](./docs/integer.md)
|
||||||
|
- [Worker thread support](./docs/threads.md)
|
||||||
|
- [Unsafe mode (advanced)](./docs/unsafe.md)
|
||||||
|
- [SQLite3 compilation (advanced)](./docs/compilation.md)
|
||||||
|
- [Contribution rules](./docs/contribution.md)
|
||||||
|
- [Code of conduct](./docs/conduct.md)
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
[MIT](./LICENSE)
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
# ===
|
||||||
|
# This is the main GYP file, which builds better-sqlite3 with SQLite3 itself.
|
||||||
|
# ===
|
||||||
|
|
||||||
|
{
|
||||||
|
'includes': ['deps/common.gypi'],
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'better_sqlite3',
|
||||||
|
'dependencies': ['deps/sqlite3.gyp:sqlite3'],
|
||||||
|
'sources': ['src/better_sqlite3.cpp'],
|
||||||
|
'cflags_cc': ['-std=c++17'],
|
||||||
|
'xcode_settings': {
|
||||||
|
'OTHER_CPLUSPLUSFLAGS': ['-std=c++17', '-stdlib=libc++'],
|
||||||
|
},
|
||||||
|
'msvs_settings': {
|
||||||
|
'VCCLCompilerTool': {
|
||||||
|
'AdditionalOptions': [
|
||||||
|
'/std:c++17',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'conditions': [
|
||||||
|
['OS=="linux"', {
|
||||||
|
'ldflags': [
|
||||||
|
'-Wl,-Bsymbolic',
|
||||||
|
'-Wl,--exclude-libs,ALL',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'target_name': 'test_extension',
|
||||||
|
'dependencies': ['deps/sqlite3.gyp:sqlite3'],
|
||||||
|
'conditions': [['sqlite3 == ""', { 'sources': ['deps/test_extension.c'] }]],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
+369
@@ -0,0 +1,369 @@
|
|||||||
|
# We borrow heavily from the kernel build setup, though we are simpler since
|
||||||
|
# we don't have Kconfig tweaking settings on us.
|
||||||
|
|
||||||
|
# The implicit make rules have it looking for RCS files, among other things.
|
||||||
|
# We instead explicitly write all the rules we care about.
|
||||||
|
# It's even quicker (saves ~200ms) to pass -r on the command line.
|
||||||
|
MAKEFLAGS=-r
|
||||||
|
|
||||||
|
# The source directory tree.
|
||||||
|
srcdir := ..
|
||||||
|
abs_srcdir := $(abspath $(srcdir))
|
||||||
|
|
||||||
|
# The name of the builddir.
|
||||||
|
builddir_name ?= .
|
||||||
|
|
||||||
|
# The V=1 flag on command line makes us verbosely print command lines.
|
||||||
|
ifdef V
|
||||||
|
quiet=
|
||||||
|
else
|
||||||
|
quiet=quiet_
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Specify BUILDTYPE=Release on the command line for a release build.
|
||||||
|
BUILDTYPE ?= Release
|
||||||
|
|
||||||
|
# Directory all our build output goes into.
|
||||||
|
# Note that this must be two directories beneath src/ for unit tests to pass,
|
||||||
|
# as they reach into the src/ directory for data with relative paths.
|
||||||
|
builddir ?= $(builddir_name)/$(BUILDTYPE)
|
||||||
|
abs_builddir := $(abspath $(builddir))
|
||||||
|
depsdir := $(builddir)/.deps
|
||||||
|
|
||||||
|
# Object output directory.
|
||||||
|
obj := $(builddir)/obj
|
||||||
|
abs_obj := $(abspath $(obj))
|
||||||
|
|
||||||
|
# We build up a list of every single one of the targets so we can slurp in the
|
||||||
|
# generated dependency rule Makefiles in one pass.
|
||||||
|
all_deps :=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CC.target ?= $(CC)
|
||||||
|
CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS)
|
||||||
|
CXX.target ?= $(CXX)
|
||||||
|
CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS)
|
||||||
|
LINK.target ?= $(LINK)
|
||||||
|
LDFLAGS.target ?= $(LDFLAGS)
|
||||||
|
AR.target ?= $(AR)
|
||||||
|
PLI.target ?= pli
|
||||||
|
|
||||||
|
# C++ apps need to be linked with g++.
|
||||||
|
LINK ?= $(CXX.target)
|
||||||
|
|
||||||
|
# TODO(evan): move all cross-compilation logic to gyp-time so we don't need
|
||||||
|
# to replicate this environment fallback in make as well.
|
||||||
|
CC.host ?= gcc
|
||||||
|
CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host)
|
||||||
|
CXX.host ?= g++
|
||||||
|
CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host)
|
||||||
|
LINK.host ?= $(CXX.host)
|
||||||
|
LDFLAGS.host ?= $(LDFLAGS_host)
|
||||||
|
AR.host ?= ar
|
||||||
|
PLI.host ?= pli
|
||||||
|
|
||||||
|
# Define a dir function that can handle spaces.
|
||||||
|
# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions
|
||||||
|
# "leading spaces cannot appear in the text of the first argument as written.
|
||||||
|
# These characters can be put into the argument value by variable substitution."
|
||||||
|
empty :=
|
||||||
|
space := $(empty) $(empty)
|
||||||
|
|
||||||
|
# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces
|
||||||
|
replace_spaces = $(subst $(space),?,$1)
|
||||||
|
unreplace_spaces = $(subst ?,$(space),$1)
|
||||||
|
dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1)))
|
||||||
|
|
||||||
|
# Flags to make gcc output dependency info. Note that you need to be
|
||||||
|
# careful here to use the flags that ccache and distcc can understand.
|
||||||
|
# We write to a dep file on the side first and then rename at the end
|
||||||
|
# so we can't end up with a broken dep file.
|
||||||
|
depfile = $(depsdir)/$(call replace_spaces,$@).d
|
||||||
|
DEPFLAGS = -MMD -MF $(depfile).raw
|
||||||
|
|
||||||
|
# We have to fixup the deps output in a few ways.
|
||||||
|
# (1) the file output should mention the proper .o file.
|
||||||
|
# ccache or distcc lose the path to the target, so we convert a rule of
|
||||||
|
# the form:
|
||||||
|
# foobar.o: DEP1 DEP2
|
||||||
|
# into
|
||||||
|
# path/to/foobar.o: DEP1 DEP2
|
||||||
|
# (2) we want missing files not to cause us to fail to build.
|
||||||
|
# We want to rewrite
|
||||||
|
# foobar.o: DEP1 DEP2 \
|
||||||
|
# DEP3
|
||||||
|
# to
|
||||||
|
# DEP1:
|
||||||
|
# DEP2:
|
||||||
|
# DEP3:
|
||||||
|
# so if the files are missing, they're just considered phony rules.
|
||||||
|
# We have to do some pretty insane escaping to get those backslashes
|
||||||
|
# and dollar signs past make, the shell, and sed at the same time.
|
||||||
|
# Doesn't work with spaces, but that's fine: .d files have spaces in
|
||||||
|
# their names replaced with other characters.
|
||||||
|
define fixup_dep
|
||||||
|
# The depfile may not exist if the input file didn't have any #includes.
|
||||||
|
touch $(depfile).raw
|
||||||
|
# Fixup path as in (1).
|
||||||
|
sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile)
|
||||||
|
# Add extra rules as in (2).
|
||||||
|
# We remove slashes and replace spaces with new lines;
|
||||||
|
# remove blank lines;
|
||||||
|
# delete the first line and append a colon to the remaining lines.
|
||||||
|
sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\
|
||||||
|
grep -v '^$$' |\
|
||||||
|
sed -e 1d -e 's|$$|:|' \
|
||||||
|
>> $(depfile)
|
||||||
|
rm $(depfile).raw
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Command definitions:
|
||||||
|
# - cmd_foo is the actual command to run;
|
||||||
|
# - quiet_cmd_foo is the brief-output summary of the command.
|
||||||
|
|
||||||
|
quiet_cmd_cc = CC($(TOOLSET)) $@
|
||||||
|
cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c
|
||||||
|
|
||||||
|
quiet_cmd_cxx = CXX($(TOOLSET)) $@
|
||||||
|
cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c
|
||||||
|
|
||||||
|
quiet_cmd_touch = TOUCH $@
|
||||||
|
cmd_touch = touch $@
|
||||||
|
|
||||||
|
quiet_cmd_copy = COPY $@
|
||||||
|
# send stderr to /dev/null to ignore messages when linking directories.
|
||||||
|
cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@")
|
||||||
|
|
||||||
|
quiet_cmd_symlink = SYMLINK $@
|
||||||
|
cmd_symlink = ln -sf "$<" "$@"
|
||||||
|
|
||||||
|
quiet_cmd_alink = AR($(TOOLSET)) $@
|
||||||
|
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
|
||||||
|
|
||||||
|
quiet_cmd_alink_thin = AR($(TOOLSET)) $@
|
||||||
|
cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
|
||||||
|
|
||||||
|
# Due to circular dependencies between libraries :(, we wrap the
|
||||||
|
# special "figure out circular dependencies" flags around the entire
|
||||||
|
# input list during linking.
|
||||||
|
quiet_cmd_link = LINK($(TOOLSET)) $@
|
||||||
|
cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group
|
||||||
|
|
||||||
|
# Note: this does not handle spaces in paths
|
||||||
|
define xargs
|
||||||
|
$(1) $(word 1,$(2))
|
||||||
|
$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2))))
|
||||||
|
endef
|
||||||
|
|
||||||
|
define write-to-file
|
||||||
|
@: >$(1)
|
||||||
|
$(call xargs,@printf "%s\n" >>$(1),$(2))
|
||||||
|
endef
|
||||||
|
|
||||||
|
OBJ_FILE_LIST := ar-file-list
|
||||||
|
|
||||||
|
define create_archive
|
||||||
|
rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
|
||||||
|
$(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
|
||||||
|
$(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define create_thin_archive
|
||||||
|
rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
|
||||||
|
$(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
|
||||||
|
$(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST)
|
||||||
|
endef
|
||||||
|
|
||||||
|
# We support two kinds of shared objects (.so):
|
||||||
|
# 1) shared_library, which is just bundling together many dependent libraries
|
||||||
|
# into a link line.
|
||||||
|
# 2) loadable_module, which is generating a module intended for dlopen().
|
||||||
|
#
|
||||||
|
# They differ only slightly:
|
||||||
|
# In the former case, we want to package all dependent code into the .so.
|
||||||
|
# In the latter case, we want to package just the API exposed by the
|
||||||
|
# outermost module.
|
||||||
|
# This means shared_library uses --whole-archive, while loadable_module doesn't.
|
||||||
|
# (Note that --whole-archive is incompatible with the --start-group used in
|
||||||
|
# normal linking.)
|
||||||
|
|
||||||
|
# Other shared-object link notes:
|
||||||
|
# - Set SONAME to the library filename so our binaries don't reference
|
||||||
|
# the local, absolute paths used on the link command-line.
|
||||||
|
quiet_cmd_solink = SOLINK($(TOOLSET)) $@
|
||||||
|
cmd_solink = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)
|
||||||
|
|
||||||
|
quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
|
||||||
|
cmd_solink_module = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# Define an escape_quotes function to escape single quotes.
|
||||||
|
# This allows us to handle quotes properly as long as we always use
|
||||||
|
# use single quotes and escape_quotes.
|
||||||
|
escape_quotes = $(subst ','\'',$(1))
|
||||||
|
# This comment is here just to include a ' to unconfuse syntax highlighting.
|
||||||
|
# Define an escape_vars function to escape '$' variable syntax.
|
||||||
|
# This allows us to read/write command lines with shell variables (e.g.
|
||||||
|
# $LD_LIBRARY_PATH), without triggering make substitution.
|
||||||
|
escape_vars = $(subst $$,$$$$,$(1))
|
||||||
|
# Helper that expands to a shell command to echo a string exactly as it is in
|
||||||
|
# make. This uses printf instead of echo because printf's behaviour with respect
|
||||||
|
# to escape sequences is more portable than echo's across different shells
|
||||||
|
# (e.g., dash, bash).
|
||||||
|
exact_echo = printf '%s\n' '$(call escape_quotes,$(1))'
|
||||||
|
|
||||||
|
# Helper to compare the command we're about to run against the command
|
||||||
|
# we logged the last time we ran the command. Produces an empty
|
||||||
|
# string (false) when the commands match.
|
||||||
|
# Tricky point: Make has no string-equality test function.
|
||||||
|
# The kernel uses the following, but it seems like it would have false
|
||||||
|
# positives, where one string reordered its arguments.
|
||||||
|
# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
|
||||||
|
# $(filter-out $(cmd_$@), $(cmd_$(1))))
|
||||||
|
# We instead substitute each for the empty string into the other, and
|
||||||
|
# say they're equal if both substitutions produce the empty string.
|
||||||
|
# .d files contain ? instead of spaces, take that into account.
|
||||||
|
command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\
|
||||||
|
$(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1))))
|
||||||
|
|
||||||
|
# Helper that is non-empty when a prerequisite changes.
|
||||||
|
# Normally make does this implicitly, but we force rules to always run
|
||||||
|
# so we can check their command lines.
|
||||||
|
# $? -- new prerequisites
|
||||||
|
# $| -- order-only dependencies
|
||||||
|
prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?))
|
||||||
|
|
||||||
|
# Helper that executes all postbuilds until one fails.
|
||||||
|
define do_postbuilds
|
||||||
|
@E=0;\
|
||||||
|
for p in $(POSTBUILDS); do\
|
||||||
|
eval $$p;\
|
||||||
|
E=$$?;\
|
||||||
|
if [ $$E -ne 0 ]; then\
|
||||||
|
break;\
|
||||||
|
fi;\
|
||||||
|
done;\
|
||||||
|
if [ $$E -ne 0 ]; then\
|
||||||
|
rm -rf "$@";\
|
||||||
|
exit $$E;\
|
||||||
|
fi
|
||||||
|
endef
|
||||||
|
|
||||||
|
# do_cmd: run a command via the above cmd_foo names, if necessary.
|
||||||
|
# Should always run for a given target to handle command-line changes.
|
||||||
|
# Second argument, if non-zero, makes it do asm/C/C++ dependency munging.
|
||||||
|
# Third argument, if non-zero, makes it do POSTBUILDS processing.
|
||||||
|
# Note: We intentionally do NOT call dirx for depfile, since it contains ? for
|
||||||
|
# spaces already and dirx strips the ? characters.
|
||||||
|
define do_cmd
|
||||||
|
$(if $(or $(command_changed),$(prereq_changed)),
|
||||||
|
@$(call exact_echo, $($(quiet)cmd_$(1)))
|
||||||
|
@mkdir -p "$(call dirx,$@)" "$(dir $(depfile))"
|
||||||
|
$(if $(findstring flock,$(word 1,$(cmd_$1))),
|
||||||
|
@$(cmd_$(1))
|
||||||
|
@echo " $(quiet_cmd_$(1)): Finished",
|
||||||
|
@$(cmd_$(1))
|
||||||
|
)
|
||||||
|
@$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile)
|
||||||
|
@$(if $(2),$(fixup_dep))
|
||||||
|
$(if $(and $(3), $(POSTBUILDS)),
|
||||||
|
$(call do_postbuilds)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Declare the "all" target first so it is the default,
|
||||||
|
# even though we don't have the deps yet.
|
||||||
|
.PHONY: all
|
||||||
|
all:
|
||||||
|
|
||||||
|
# make looks for ways to re-generate included makefiles, but in our case, we
|
||||||
|
# don't have a direct way. Explicitly telling make that it has nothing to do
|
||||||
|
# for them makes it go faster.
|
||||||
|
%.d: ;
|
||||||
|
|
||||||
|
# Use FORCE_DO_CMD to force a target to run. Should be coupled with
|
||||||
|
# do_cmd.
|
||||||
|
.PHONY: FORCE_DO_CMD
|
||||||
|
FORCE_DO_CMD:
|
||||||
|
|
||||||
|
TOOLSET := target
|
||||||
|
# Suffix rules, putting all outputs into $(obj).
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
# Try building from generated source, too.
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
|
||||||
|
$(findstring $(join ^,$(prefix)),\
|
||||||
|
$(join ^,better_sqlite3.target.mk)))),)
|
||||||
|
include better_sqlite3.target.mk
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
|
||||||
|
$(findstring $(join ^,$(prefix)),\
|
||||||
|
$(join ^,deps/locate_sqlite3.target.mk)))),)
|
||||||
|
include deps/locate_sqlite3.target.mk
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
|
||||||
|
$(findstring $(join ^,$(prefix)),\
|
||||||
|
$(join ^,deps/sqlite3.target.mk)))),)
|
||||||
|
include deps/sqlite3.target.mk
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
|
||||||
|
$(findstring $(join ^,$(prefix)),\
|
||||||
|
$(join ^,test_extension.target.mk)))),)
|
||||||
|
include test_extension.target.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
quiet_cmd_regen_makefile = ACTION Regenerating $@
|
||||||
|
cmd_regen_makefile = cd $(srcdir); /usr/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/root/.cache/node-gyp/22.22.2" "-Dnode_gyp_dir=/usr/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/root/.cache/node-gyp/22.22.2/<(target_arch)/node.lib" "-Dmodule_root_dir=/root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3/build/config.gypi -I/usr/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/root/.cache/node-gyp/22.22.2/include/node/common.gypi "--toplevel-dir=." binding.gyp
|
||||||
|
Makefile: $(srcdir)/../../../../../../../usr/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/../../../../../../.cache/node-gyp/22.22.2/include/node/common.gypi $(srcdir)/binding.gyp $(srcdir)/build/config.gypi $(srcdir)/deps/common.gypi $(srcdir)/deps/defines.gypi $(srcdir)/deps/sqlite3.gyp
|
||||||
|
$(call do_cmd,regen_makefile)
|
||||||
|
|
||||||
|
# "all" is a concatenation of the "all" targets from all the included
|
||||||
|
# sub-makefiles. This is just here to clarify.
|
||||||
|
all:
|
||||||
|
|
||||||
|
# Add in dependency-tracking rules. $(all_deps) is the list of every single
|
||||||
|
# target in our tree. Only consider the ones with .d (dependency) info:
|
||||||
|
d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d))
|
||||||
|
ifneq ($(d_files),)
|
||||||
|
include $(d_files)
|
||||||
|
endif
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/better_sqlite3.node := ln -f "Release/obj.target/better_sqlite3.node" "Release/better_sqlite3.node" 2>/dev/null || (rm -rf "Release/better_sqlite3.node" && cp -af "Release/obj.target/better_sqlite3.node" "Release/better_sqlite3.node")
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/obj.target/better_sqlite3.node := g++ -o Release/obj.target/better_sqlite3.node -shared -pthread -rdynamic -Wl,-Bsymbolic -Wl,--exclude-libs,ALL -m64 -Wl,-soname=better_sqlite3.node -Wl,--start-group Release/obj.target/better_sqlite3/src/better_sqlite3.o Release/obj.target/deps/sqlite3.a -Wl,--end-group
|
||||||
Generated
Vendored
+127
@@ -0,0 +1,127 @@
|
|||||||
|
cmd_Release/obj.target/better_sqlite3/src/better_sqlite3.o := g++ -o Release/obj.target/better_sqlite3/src/better_sqlite3.o ../src/better_sqlite3.cpp '-DNODE_GYP_MODULE_NAME=better_sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_LARGEFILE_SOURCE' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/root/.cache/node-gyp/22.22.2/include/node -I/root/.cache/node-gyp/22.22.2/src -I/root/.cache/node-gyp/22.22.2/deps/openssl/config -I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include -I/root/.cache/node-gyp/22.22.2/deps/uv/include -I/root/.cache/node-gyp/22.22.2/deps/zlib -I/root/.cache/node-gyp/22.22.2/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fno-strict-aliasing -std=gnu++17 -std=c++17 -MMD -MF ./Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d.raw -c
|
||||||
|
Release/obj.target/better_sqlite3/src/better_sqlite3.o: \
|
||||||
|
../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/cppgc/common.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8config.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-array-buffer.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-local-handle.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-handle-base.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-internal.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8config.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-object.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-maybe.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-persistent-handle.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-weak-callback-info.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-primitive.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-data.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-value.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-traced-handle.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-container.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-context.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-snapshot.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-isolate.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-callbacks.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-promise.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-debug.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-script.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-memory-span.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-message.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-embedder-heap.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-function-callback.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-microtask.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-statistics.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-unwinder.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-embedder-state-scope.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-date.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-exception.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-extension.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-external.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-function.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-template.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-initialization.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-platform.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-source-location.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-json.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-locker.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-microtask-queue.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-primitive-object.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-proxy.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-regexp.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-typed-array.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-value-serializer.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-version.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-wasm.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_version.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_api.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/js_native_api.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/js_native_api_types.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_api_types.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_object_wrap.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_buffer.h \
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node.h
|
||||||
|
../src/better_sqlite3.cpp:
|
||||||
|
../src/better_sqlite3.hpp:
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/cppgc/common.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8config.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-array-buffer.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-local-handle.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-handle-base.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-internal.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8config.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-object.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-maybe.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-persistent-handle.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-weak-callback-info.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-primitive.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-data.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-value.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-traced-handle.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-container.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-context.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-snapshot.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-isolate.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-callbacks.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-promise.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-debug.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-script.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-memory-span.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-message.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-embedder-heap.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-function-callback.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-microtask.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-statistics.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-unwinder.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-embedder-state-scope.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-date.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-exception.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-extension.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-external.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-function.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-template.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-initialization.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-platform.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-source-location.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-json.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-locker.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-microtask-queue.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-primitive-object.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-proxy.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-regexp.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-typed-array.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-value-serializer.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-version.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/v8-wasm.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_version.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_api.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/js_native_api.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/js_native_api_types.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_api_types.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_object_wrap.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node_buffer.h:
|
||||||
|
/root/.cache/node-gyp/22.22.2/include/node/node.h:
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/obj.target/deps/locate_sqlite3.stamp := touch Release/obj.target/deps/locate_sqlite3.stamp
|
||||||
Generated
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
cmd_Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o := cc -o Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o Release/obj/gen/sqlite3/sqlite3.c '-DNODE_GYP_MODULE_NAME=sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_LARGEFILE_SOURCE' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_INT16_T=1' '-DHAVE_INT32_T=1' '-DHAVE_INT8_T=1' '-DHAVE_STDINT_H=1' '-DHAVE_UINT16_T=1' '-DHAVE_UINT32_T=1' '-DHAVE_UINT8_T=1' '-DHAVE_USLEEP=1' '-DSQLITE_DEFAULT_CACHE_SIZE=-16000' '-DSQLITE_DEFAULT_FOREIGN_KEYS=1' '-DSQLITE_DEFAULT_MEMSTATUS=0' '-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' '-DSQLITE_DQS=0' '-DSQLITE_ENABLE_COLUMN_METADATA' '-DSQLITE_ENABLE_DESERIALIZE' '-DSQLITE_ENABLE_FTS3' '-DSQLITE_ENABLE_FTS3_PARENTHESIS' '-DSQLITE_ENABLE_FTS4' '-DSQLITE_ENABLE_FTS5' '-DSQLITE_ENABLE_GEOPOLY' '-DSQLITE_ENABLE_JSON1' '-DSQLITE_ENABLE_MATH_FUNCTIONS' '-DSQLITE_ENABLE_RTREE' '-DSQLITE_ENABLE_STAT4' '-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' '-DSQLITE_OMIT_DEPRECATED' '-DSQLITE_OMIT_PROGRESS_CALLBACK' '-DSQLITE_OMIT_SHARED_CACHE' '-DSQLITE_OMIT_TCL_VARIABLE' '-DSQLITE_SOUNDEX' '-DSQLITE_THREADSAFE=2' '-DSQLITE_TRACE_SIZE_LIMIT=32' '-DSQLITE_USE_URI=0' '-DNDEBUG' -I/root/.cache/node-gyp/22.22.2/include/node -I/root/.cache/node-gyp/22.22.2/src -I/root/.cache/node-gyp/22.22.2/deps/openssl/config -I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include -I/root/.cache/node-gyp/22.22.2/deps/uv/include -I/root/.cache/node-gyp/22.22.2/deps/zlib -I/root/.cache/node-gyp/22.22.2/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -std=c99 -w -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d.raw -c
|
||||||
|
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o: \
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.c
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.c:
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/obj.target/test_extension.node := g++ -o Release/obj.target/test_extension.node -shared -pthread -rdynamic -m64 -Wl,-soname=test_extension.node -Wl,--start-group Release/obj.target/test_extension/deps/test_extension.o Release/obj.target/deps/sqlite3.a -Wl,--end-group
|
||||||
Generated
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
cmd_Release/obj.target/test_extension/deps/test_extension.o := cc -o Release/obj.target/test_extension/deps/test_extension.o ../deps/test_extension.c '-DNODE_GYP_MODULE_NAME=test_extension' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_LARGEFILE_SOURCE' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/root/.cache/node-gyp/22.22.2/include/node -I/root/.cache/node-gyp/22.22.2/src -I/root/.cache/node-gyp/22.22.2/deps/openssl/config -I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include -I/root/.cache/node-gyp/22.22.2/deps/uv/include -I/root/.cache/node-gyp/22.22.2/deps/zlib -I/root/.cache/node-gyp/22.22.2/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d.raw -c
|
||||||
|
Release/obj.target/test_extension/deps/test_extension.o: \
|
||||||
|
../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.h
|
||||||
|
../deps/test_extension.c:
|
||||||
|
Release/obj/gen/sqlite3/sqlite3ext.h:
|
||||||
|
Release/obj/gen/sqlite3/sqlite3.h:
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/sqlite3.a := ln -f "Release/obj.target/deps/sqlite3.a" "Release/sqlite3.a" 2>/dev/null || (rm -rf "Release/sqlite3.a" && cp -af "Release/obj.target/deps/sqlite3.a" "Release/sqlite3.a")
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_Release/test_extension.node := ln -f "Release/obj.target/test_extension.node" "Release/test_extension.node" 2>/dev/null || (rm -rf "Release/test_extension.node" && cp -af "Release/obj.target/test_extension.node" "Release/test_extension.node")
|
||||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cmd_ba23eeee118cd63e16015df367567cb043fed872.intermediate := LD_LIBRARY_PATH=/root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3/build/Release/lib.host:/root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3/build/Release/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../deps; mkdir -p /root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3; node copy.js "/root/.openclaw/workspace/ssl-manager/backend/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3" ""
|
||||||
BIN
Binary file not shown.
Generated
Vendored
Executable
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
Generated
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o
|
||||||
Generated
Vendored
BIN
Binary file not shown.
Generated
Vendored
Executable
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
+255954
File diff suppressed because it is too large
Load Diff
+13374
File diff suppressed because it is too large
Load Diff
+719
@@ -0,0 +1,719 @@
|
|||||||
|
/*
|
||||||
|
** 2006 June 7
|
||||||
|
**
|
||||||
|
** The author disclaims copyright to this source code. In place of
|
||||||
|
** a legal notice, here is a blessing:
|
||||||
|
**
|
||||||
|
** May you do good and not evil.
|
||||||
|
** May you find forgiveness for yourself and forgive others.
|
||||||
|
** May you share freely, never taking more than you give.
|
||||||
|
**
|
||||||
|
*************************************************************************
|
||||||
|
** This header file defines the SQLite interface for use by
|
||||||
|
** shared libraries that want to be imported as extensions into
|
||||||
|
** an SQLite instance. Shared libraries that intend to be loaded
|
||||||
|
** as extensions by SQLite should #include this file instead of
|
||||||
|
** sqlite3.h.
|
||||||
|
*/
|
||||||
|
#ifndef SQLITE3EXT_H
|
||||||
|
#define SQLITE3EXT_H
|
||||||
|
#include "sqlite3.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following structure holds pointers to all of the SQLite API
|
||||||
|
** routines.
|
||||||
|
**
|
||||||
|
** WARNING: In order to maintain backwards compatibility, add new
|
||||||
|
** interfaces to the end of this structure only. If you insert new
|
||||||
|
** interfaces in the middle of this structure, then older different
|
||||||
|
** versions of SQLite will not be able to load each other's shared
|
||||||
|
** libraries!
|
||||||
|
*/
|
||||||
|
struct sqlite3_api_routines {
|
||||||
|
void * (*aggregate_context)(sqlite3_context*,int nBytes);
|
||||||
|
int (*aggregate_count)(sqlite3_context*);
|
||||||
|
int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
|
||||||
|
int (*bind_double)(sqlite3_stmt*,int,double);
|
||||||
|
int (*bind_int)(sqlite3_stmt*,int,int);
|
||||||
|
int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
|
||||||
|
int (*bind_null)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_parameter_count)(sqlite3_stmt*);
|
||||||
|
int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
|
||||||
|
const char * (*bind_parameter_name)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
|
||||||
|
int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
|
||||||
|
int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
|
||||||
|
int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
|
||||||
|
int (*busy_timeout)(sqlite3*,int ms);
|
||||||
|
int (*changes)(sqlite3*);
|
||||||
|
int (*close)(sqlite3*);
|
||||||
|
int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const char*));
|
||||||
|
int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const void*));
|
||||||
|
const void * (*column_blob)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_count)(sqlite3_stmt*pStmt);
|
||||||
|
const char * (*column_database_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_database_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_decltype)(sqlite3_stmt*,int i);
|
||||||
|
const void * (*column_decltype16)(sqlite3_stmt*,int);
|
||||||
|
double (*column_double)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_int)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
|
||||||
|
const char * (*column_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_origin_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_origin_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_table_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_table_name16)(sqlite3_stmt*,int);
|
||||||
|
const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
|
||||||
|
const void * (*column_text16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_type)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
|
||||||
|
void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
|
||||||
|
int (*complete)(const char*sql);
|
||||||
|
int (*complete16)(const void*sql);
|
||||||
|
int (*create_collation)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_collation16)(sqlite3*,const void*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_function)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_function16)(sqlite3*,const void*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
|
||||||
|
int (*data_count)(sqlite3_stmt*pStmt);
|
||||||
|
sqlite3 * (*db_handle)(sqlite3_stmt*);
|
||||||
|
int (*declare_vtab)(sqlite3*,const char*);
|
||||||
|
int (*enable_shared_cache)(int);
|
||||||
|
int (*errcode)(sqlite3*db);
|
||||||
|
const char * (*errmsg)(sqlite3*);
|
||||||
|
const void * (*errmsg16)(sqlite3*);
|
||||||
|
int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
|
||||||
|
int (*expired)(sqlite3_stmt*);
|
||||||
|
int (*finalize)(sqlite3_stmt*pStmt);
|
||||||
|
void (*free)(void*);
|
||||||
|
void (*free_table)(char**result);
|
||||||
|
int (*get_autocommit)(sqlite3*);
|
||||||
|
void * (*get_auxdata)(sqlite3_context*,int);
|
||||||
|
int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
|
||||||
|
int (*global_recover)(void);
|
||||||
|
void (*interruptx)(sqlite3*);
|
||||||
|
sqlite_int64 (*last_insert_rowid)(sqlite3*);
|
||||||
|
const char * (*libversion)(void);
|
||||||
|
int (*libversion_number)(void);
|
||||||
|
void *(*malloc)(int);
|
||||||
|
char * (*mprintf)(const char*,...);
|
||||||
|
int (*open)(const char*,sqlite3**);
|
||||||
|
int (*open16)(const void*,sqlite3**);
|
||||||
|
int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
|
||||||
|
void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
|
||||||
|
void *(*realloc)(void*,int);
|
||||||
|
int (*reset)(sqlite3_stmt*pStmt);
|
||||||
|
void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_double)(sqlite3_context*,double);
|
||||||
|
void (*result_error)(sqlite3_context*,const char*,int);
|
||||||
|
void (*result_error16)(sqlite3_context*,const void*,int);
|
||||||
|
void (*result_int)(sqlite3_context*,int);
|
||||||
|
void (*result_int64)(sqlite3_context*,sqlite_int64);
|
||||||
|
void (*result_null)(sqlite3_context*);
|
||||||
|
void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
|
||||||
|
void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_value)(sqlite3_context*,sqlite3_value*);
|
||||||
|
void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
|
||||||
|
int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
|
||||||
|
const char*,const char*),void*);
|
||||||
|
void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
|
||||||
|
char * (*xsnprintf)(int,char*,const char*,...);
|
||||||
|
int (*step)(sqlite3_stmt*);
|
||||||
|
int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
|
||||||
|
char const**,char const**,int*,int*,int*);
|
||||||
|
void (*thread_cleanup)(void);
|
||||||
|
int (*total_changes)(sqlite3*);
|
||||||
|
void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
|
||||||
|
int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
|
||||||
|
void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
|
||||||
|
sqlite_int64),void*);
|
||||||
|
void * (*user_data)(sqlite3_context*);
|
||||||
|
const void * (*value_blob)(sqlite3_value*);
|
||||||
|
int (*value_bytes)(sqlite3_value*);
|
||||||
|
int (*value_bytes16)(sqlite3_value*);
|
||||||
|
double (*value_double)(sqlite3_value*);
|
||||||
|
int (*value_int)(sqlite3_value*);
|
||||||
|
sqlite_int64 (*value_int64)(sqlite3_value*);
|
||||||
|
int (*value_numeric_type)(sqlite3_value*);
|
||||||
|
const unsigned char * (*value_text)(sqlite3_value*);
|
||||||
|
const void * (*value_text16)(sqlite3_value*);
|
||||||
|
const void * (*value_text16be)(sqlite3_value*);
|
||||||
|
const void * (*value_text16le)(sqlite3_value*);
|
||||||
|
int (*value_type)(sqlite3_value*);
|
||||||
|
char *(*vmprintf)(const char*,va_list);
|
||||||
|
/* Added ??? */
|
||||||
|
int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
|
||||||
|
/* Added by 3.3.13 */
|
||||||
|
int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
int (*clear_bindings)(sqlite3_stmt*);
|
||||||
|
/* Added by 3.4.1 */
|
||||||
|
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
|
||||||
|
void (*xDestroy)(void *));
|
||||||
|
/* Added by 3.5.0 */
|
||||||
|
int (*bind_zeroblob)(sqlite3_stmt*,int,int);
|
||||||
|
int (*blob_bytes)(sqlite3_blob*);
|
||||||
|
int (*blob_close)(sqlite3_blob*);
|
||||||
|
int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
|
||||||
|
int,sqlite3_blob**);
|
||||||
|
int (*blob_read)(sqlite3_blob*,void*,int,int);
|
||||||
|
int (*blob_write)(sqlite3_blob*,const void*,int,int);
|
||||||
|
int (*create_collation_v2)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*),
|
||||||
|
void(*)(void*));
|
||||||
|
int (*file_control)(sqlite3*,const char*,int,void*);
|
||||||
|
sqlite3_int64 (*memory_highwater)(int);
|
||||||
|
sqlite3_int64 (*memory_used)(void);
|
||||||
|
sqlite3_mutex *(*mutex_alloc)(int);
|
||||||
|
void (*mutex_enter)(sqlite3_mutex*);
|
||||||
|
void (*mutex_free)(sqlite3_mutex*);
|
||||||
|
void (*mutex_leave)(sqlite3_mutex*);
|
||||||
|
int (*mutex_try)(sqlite3_mutex*);
|
||||||
|
int (*open_v2)(const char*,sqlite3**,int,const char*);
|
||||||
|
int (*release_memory)(int);
|
||||||
|
void (*result_error_nomem)(sqlite3_context*);
|
||||||
|
void (*result_error_toobig)(sqlite3_context*);
|
||||||
|
int (*sleep)(int);
|
||||||
|
void (*soft_heap_limit)(int);
|
||||||
|
sqlite3_vfs *(*vfs_find)(const char*);
|
||||||
|
int (*vfs_register)(sqlite3_vfs*,int);
|
||||||
|
int (*vfs_unregister)(sqlite3_vfs*);
|
||||||
|
int (*xthreadsafe)(void);
|
||||||
|
void (*result_zeroblob)(sqlite3_context*,int);
|
||||||
|
void (*result_error_code)(sqlite3_context*,int);
|
||||||
|
int (*test_control)(int, ...);
|
||||||
|
void (*randomness)(int,void*);
|
||||||
|
sqlite3 *(*context_db_handle)(sqlite3_context*);
|
||||||
|
int (*extended_result_codes)(sqlite3*,int);
|
||||||
|
int (*limit)(sqlite3*,int,int);
|
||||||
|
sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
|
||||||
|
const char *(*sql)(sqlite3_stmt*);
|
||||||
|
int (*status)(int,int*,int*,int);
|
||||||
|
int (*backup_finish)(sqlite3_backup*);
|
||||||
|
sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
|
||||||
|
int (*backup_pagecount)(sqlite3_backup*);
|
||||||
|
int (*backup_remaining)(sqlite3_backup*);
|
||||||
|
int (*backup_step)(sqlite3_backup*,int);
|
||||||
|
const char *(*compileoption_get)(int);
|
||||||
|
int (*compileoption_used)(const char*);
|
||||||
|
int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*),
|
||||||
|
void(*xDestroy)(void*));
|
||||||
|
int (*db_config)(sqlite3*,int,...);
|
||||||
|
sqlite3_mutex *(*db_mutex)(sqlite3*);
|
||||||
|
int (*db_status)(sqlite3*,int,int*,int*,int);
|
||||||
|
int (*extended_errcode)(sqlite3*);
|
||||||
|
void (*log)(int,const char*,...);
|
||||||
|
sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
|
||||||
|
const char *(*sourceid)(void);
|
||||||
|
int (*stmt_status)(sqlite3_stmt*,int,int);
|
||||||
|
int (*strnicmp)(const char*,const char*,int);
|
||||||
|
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
|
||||||
|
int (*wal_autocheckpoint)(sqlite3*,int);
|
||||||
|
int (*wal_checkpoint)(sqlite3*,const char*);
|
||||||
|
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
|
||||||
|
int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
|
||||||
|
int (*vtab_config)(sqlite3*,int op,...);
|
||||||
|
int (*vtab_on_conflict)(sqlite3*);
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
int (*close_v2)(sqlite3*);
|
||||||
|
const char *(*db_filename)(sqlite3*,const char*);
|
||||||
|
int (*db_readonly)(sqlite3*,const char*);
|
||||||
|
int (*db_release_memory)(sqlite3*);
|
||||||
|
const char *(*errstr)(int);
|
||||||
|
int (*stmt_busy)(sqlite3_stmt*);
|
||||||
|
int (*stmt_readonly)(sqlite3_stmt*);
|
||||||
|
int (*stricmp)(const char*,const char*);
|
||||||
|
int (*uri_boolean)(const char*,const char*,int);
|
||||||
|
sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
|
||||||
|
const char *(*uri_parameter)(const char*,const char*);
|
||||||
|
char *(*xvsnprintf)(int,char*,const char*,va_list);
|
||||||
|
int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
int (*auto_extension)(void(*)(void));
|
||||||
|
int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*),unsigned char);
|
||||||
|
int (*cancel_auto_extension)(void(*)(void));
|
||||||
|
int (*load_extension)(sqlite3*,const char*,const char*,char**);
|
||||||
|
void *(*malloc64)(sqlite3_uint64);
|
||||||
|
sqlite3_uint64 (*msize)(void*);
|
||||||
|
void *(*realloc64)(void*,sqlite3_uint64);
|
||||||
|
void (*reset_auto_extension)(void);
|
||||||
|
void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*), unsigned char);
|
||||||
|
int (*strglob)(const char*,const char*);
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
sqlite3_value *(*value_dup)(const sqlite3_value*);
|
||||||
|
void (*value_free)(sqlite3_value*);
|
||||||
|
int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64);
|
||||||
|
int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64);
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
unsigned int (*value_subtype)(sqlite3_value*);
|
||||||
|
void (*result_subtype)(sqlite3_context*,unsigned int);
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int);
|
||||||
|
int (*strlike)(const char*,const char*,unsigned int);
|
||||||
|
int (*db_cacheflush)(sqlite3*);
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
int (*system_errno)(sqlite3*);
|
||||||
|
/* Version 3.14.0 and later */
|
||||||
|
int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*);
|
||||||
|
char *(*expanded_sql)(sqlite3_stmt*);
|
||||||
|
/* Version 3.18.0 and later */
|
||||||
|
void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64);
|
||||||
|
/* Version 3.20.0 and later */
|
||||||
|
int (*prepare_v3)(sqlite3*,const char*,int,unsigned int,
|
||||||
|
sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int,
|
||||||
|
sqlite3_stmt**,const void**);
|
||||||
|
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
|
||||||
|
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
|
||||||
|
void *(*value_pointer)(sqlite3_value*,const char*);
|
||||||
|
int (*vtab_nochange)(sqlite3_context*);
|
||||||
|
int (*value_nochange)(sqlite3_value*);
|
||||||
|
const char *(*vtab_collation)(sqlite3_index_info*,int);
|
||||||
|
/* Version 3.24.0 and later */
|
||||||
|
int (*keyword_count)(void);
|
||||||
|
int (*keyword_name)(int,const char**,int*);
|
||||||
|
int (*keyword_check)(const char*,int);
|
||||||
|
sqlite3_str *(*str_new)(sqlite3*);
|
||||||
|
char *(*str_finish)(sqlite3_str*);
|
||||||
|
void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
|
||||||
|
void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
|
||||||
|
void (*str_append)(sqlite3_str*, const char *zIn, int N);
|
||||||
|
void (*str_appendall)(sqlite3_str*, const char *zIn);
|
||||||
|
void (*str_appendchar)(sqlite3_str*, int N, char C);
|
||||||
|
void (*str_reset)(sqlite3_str*);
|
||||||
|
int (*str_errcode)(sqlite3_str*);
|
||||||
|
int (*str_length)(sqlite3_str*);
|
||||||
|
char *(*str_value)(sqlite3_str*);
|
||||||
|
/* Version 3.25.0 and later */
|
||||||
|
int (*create_window_function)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*),
|
||||||
|
void (*xValue)(sqlite3_context*),
|
||||||
|
void (*xInv)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void(*xDestroy)(void*));
|
||||||
|
/* Version 3.26.0 and later */
|
||||||
|
const char *(*normalized_sql)(sqlite3_stmt*);
|
||||||
|
/* Version 3.28.0 and later */
|
||||||
|
int (*stmt_isexplain)(sqlite3_stmt*);
|
||||||
|
int (*value_frombind)(sqlite3_value*);
|
||||||
|
/* Version 3.30.0 and later */
|
||||||
|
int (*drop_modules)(sqlite3*,const char**);
|
||||||
|
/* Version 3.31.0 and later */
|
||||||
|
sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64);
|
||||||
|
const char *(*uri_key)(const char*,int);
|
||||||
|
const char *(*filename_database)(const char*);
|
||||||
|
const char *(*filename_journal)(const char*);
|
||||||
|
const char *(*filename_wal)(const char*);
|
||||||
|
/* Version 3.32.0 and later */
|
||||||
|
const char *(*create_filename)(const char*,const char*,const char*,
|
||||||
|
int,const char**);
|
||||||
|
void (*free_filename)(const char*);
|
||||||
|
sqlite3_file *(*database_file_object)(const char*);
|
||||||
|
/* Version 3.34.0 and later */
|
||||||
|
int (*txn_state)(sqlite3*,const char*);
|
||||||
|
/* Version 3.36.1 and later */
|
||||||
|
sqlite3_int64 (*changes64)(sqlite3*);
|
||||||
|
sqlite3_int64 (*total_changes64)(sqlite3*);
|
||||||
|
/* Version 3.37.0 and later */
|
||||||
|
int (*autovacuum_pages)(sqlite3*,
|
||||||
|
unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
|
||||||
|
void*, void(*)(void*));
|
||||||
|
/* Version 3.38.0 and later */
|
||||||
|
int (*error_offset)(sqlite3*);
|
||||||
|
int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**);
|
||||||
|
int (*vtab_distinct)(sqlite3_index_info*);
|
||||||
|
int (*vtab_in)(sqlite3_index_info*,int,int);
|
||||||
|
int (*vtab_in_first)(sqlite3_value*,sqlite3_value**);
|
||||||
|
int (*vtab_in_next)(sqlite3_value*,sqlite3_value**);
|
||||||
|
/* Version 3.39.0 and later */
|
||||||
|
int (*deserialize)(sqlite3*,const char*,unsigned char*,
|
||||||
|
sqlite3_int64,sqlite3_int64,unsigned);
|
||||||
|
unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*,
|
||||||
|
unsigned int);
|
||||||
|
const char *(*db_name)(sqlite3*,int);
|
||||||
|
/* Version 3.40.0 and later */
|
||||||
|
int (*value_encoding)(sqlite3_value*);
|
||||||
|
/* Version 3.41.0 and later */
|
||||||
|
int (*is_interrupted)(sqlite3*);
|
||||||
|
/* Version 3.43.0 and later */
|
||||||
|
int (*stmt_explain)(sqlite3_stmt*,int);
|
||||||
|
/* Version 3.44.0 and later */
|
||||||
|
void *(*get_clientdata)(sqlite3*,const char*);
|
||||||
|
int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*));
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This is the function signature used for all extension entry points. It
|
||||||
|
** is also defined in the file "loadext.c".
|
||||||
|
*/
|
||||||
|
typedef int (*sqlite3_loadext_entry)(
|
||||||
|
sqlite3 *db, /* Handle to the database. */
|
||||||
|
char **pzErrMsg, /* Used to set error string on failure. */
|
||||||
|
const sqlite3_api_routines *pThunk /* Extension API function pointers. */
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following macros redefine the API routines so that they are
|
||||||
|
** redirected through the global sqlite3_api structure.
|
||||||
|
**
|
||||||
|
** This header file is also used by the loadext.c source file
|
||||||
|
** (part of the main SQLite library - not an extension) so that
|
||||||
|
** it can get access to the sqlite3_api_routines structure
|
||||||
|
** definition. But the main library does not want to redefine
|
||||||
|
** the API. So the redefinition macros are only valid if the
|
||||||
|
** SQLITE_CORE macros is undefined.
|
||||||
|
*/
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
|
||||||
|
#endif
|
||||||
|
#define sqlite3_bind_blob sqlite3_api->bind_blob
|
||||||
|
#define sqlite3_bind_double sqlite3_api->bind_double
|
||||||
|
#define sqlite3_bind_int sqlite3_api->bind_int
|
||||||
|
#define sqlite3_bind_int64 sqlite3_api->bind_int64
|
||||||
|
#define sqlite3_bind_null sqlite3_api->bind_null
|
||||||
|
#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
|
||||||
|
#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
|
||||||
|
#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
|
||||||
|
#define sqlite3_bind_text sqlite3_api->bind_text
|
||||||
|
#define sqlite3_bind_text16 sqlite3_api->bind_text16
|
||||||
|
#define sqlite3_bind_value sqlite3_api->bind_value
|
||||||
|
#define sqlite3_busy_handler sqlite3_api->busy_handler
|
||||||
|
#define sqlite3_busy_timeout sqlite3_api->busy_timeout
|
||||||
|
#define sqlite3_changes sqlite3_api->changes
|
||||||
|
#define sqlite3_close sqlite3_api->close
|
||||||
|
#define sqlite3_collation_needed sqlite3_api->collation_needed
|
||||||
|
#define sqlite3_collation_needed16 sqlite3_api->collation_needed16
|
||||||
|
#define sqlite3_column_blob sqlite3_api->column_blob
|
||||||
|
#define sqlite3_column_bytes sqlite3_api->column_bytes
|
||||||
|
#define sqlite3_column_bytes16 sqlite3_api->column_bytes16
|
||||||
|
#define sqlite3_column_count sqlite3_api->column_count
|
||||||
|
#define sqlite3_column_database_name sqlite3_api->column_database_name
|
||||||
|
#define sqlite3_column_database_name16 sqlite3_api->column_database_name16
|
||||||
|
#define sqlite3_column_decltype sqlite3_api->column_decltype
|
||||||
|
#define sqlite3_column_decltype16 sqlite3_api->column_decltype16
|
||||||
|
#define sqlite3_column_double sqlite3_api->column_double
|
||||||
|
#define sqlite3_column_int sqlite3_api->column_int
|
||||||
|
#define sqlite3_column_int64 sqlite3_api->column_int64
|
||||||
|
#define sqlite3_column_name sqlite3_api->column_name
|
||||||
|
#define sqlite3_column_name16 sqlite3_api->column_name16
|
||||||
|
#define sqlite3_column_origin_name sqlite3_api->column_origin_name
|
||||||
|
#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
|
||||||
|
#define sqlite3_column_table_name sqlite3_api->column_table_name
|
||||||
|
#define sqlite3_column_table_name16 sqlite3_api->column_table_name16
|
||||||
|
#define sqlite3_column_text sqlite3_api->column_text
|
||||||
|
#define sqlite3_column_text16 sqlite3_api->column_text16
|
||||||
|
#define sqlite3_column_type sqlite3_api->column_type
|
||||||
|
#define sqlite3_column_value sqlite3_api->column_value
|
||||||
|
#define sqlite3_commit_hook sqlite3_api->commit_hook
|
||||||
|
#define sqlite3_complete sqlite3_api->complete
|
||||||
|
#define sqlite3_complete16 sqlite3_api->complete16
|
||||||
|
#define sqlite3_create_collation sqlite3_api->create_collation
|
||||||
|
#define sqlite3_create_collation16 sqlite3_api->create_collation16
|
||||||
|
#define sqlite3_create_function sqlite3_api->create_function
|
||||||
|
#define sqlite3_create_function16 sqlite3_api->create_function16
|
||||||
|
#define sqlite3_create_module sqlite3_api->create_module
|
||||||
|
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2
|
||||||
|
#define sqlite3_data_count sqlite3_api->data_count
|
||||||
|
#define sqlite3_db_handle sqlite3_api->db_handle
|
||||||
|
#define sqlite3_declare_vtab sqlite3_api->declare_vtab
|
||||||
|
#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
|
||||||
|
#define sqlite3_errcode sqlite3_api->errcode
|
||||||
|
#define sqlite3_errmsg sqlite3_api->errmsg
|
||||||
|
#define sqlite3_errmsg16 sqlite3_api->errmsg16
|
||||||
|
#define sqlite3_exec sqlite3_api->exec
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_expired sqlite3_api->expired
|
||||||
|
#endif
|
||||||
|
#define sqlite3_finalize sqlite3_api->finalize
|
||||||
|
#define sqlite3_free sqlite3_api->free
|
||||||
|
#define sqlite3_free_table sqlite3_api->free_table
|
||||||
|
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
|
||||||
|
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
|
||||||
|
#define sqlite3_get_table sqlite3_api->get_table
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_global_recover sqlite3_api->global_recover
|
||||||
|
#endif
|
||||||
|
#define sqlite3_interrupt sqlite3_api->interruptx
|
||||||
|
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
|
||||||
|
#define sqlite3_libversion sqlite3_api->libversion
|
||||||
|
#define sqlite3_libversion_number sqlite3_api->libversion_number
|
||||||
|
#define sqlite3_malloc sqlite3_api->malloc
|
||||||
|
#define sqlite3_mprintf sqlite3_api->mprintf
|
||||||
|
#define sqlite3_open sqlite3_api->open
|
||||||
|
#define sqlite3_open16 sqlite3_api->open16
|
||||||
|
#define sqlite3_prepare sqlite3_api->prepare
|
||||||
|
#define sqlite3_prepare16 sqlite3_api->prepare16
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_profile sqlite3_api->profile
|
||||||
|
#define sqlite3_progress_handler sqlite3_api->progress_handler
|
||||||
|
#define sqlite3_realloc sqlite3_api->realloc
|
||||||
|
#define sqlite3_reset sqlite3_api->reset
|
||||||
|
#define sqlite3_result_blob sqlite3_api->result_blob
|
||||||
|
#define sqlite3_result_double sqlite3_api->result_double
|
||||||
|
#define sqlite3_result_error sqlite3_api->result_error
|
||||||
|
#define sqlite3_result_error16 sqlite3_api->result_error16
|
||||||
|
#define sqlite3_result_int sqlite3_api->result_int
|
||||||
|
#define sqlite3_result_int64 sqlite3_api->result_int64
|
||||||
|
#define sqlite3_result_null sqlite3_api->result_null
|
||||||
|
#define sqlite3_result_text sqlite3_api->result_text
|
||||||
|
#define sqlite3_result_text16 sqlite3_api->result_text16
|
||||||
|
#define sqlite3_result_text16be sqlite3_api->result_text16be
|
||||||
|
#define sqlite3_result_text16le sqlite3_api->result_text16le
|
||||||
|
#define sqlite3_result_value sqlite3_api->result_value
|
||||||
|
#define sqlite3_rollback_hook sqlite3_api->rollback_hook
|
||||||
|
#define sqlite3_set_authorizer sqlite3_api->set_authorizer
|
||||||
|
#define sqlite3_set_auxdata sqlite3_api->set_auxdata
|
||||||
|
#define sqlite3_snprintf sqlite3_api->xsnprintf
|
||||||
|
#define sqlite3_step sqlite3_api->step
|
||||||
|
#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
|
||||||
|
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
|
||||||
|
#define sqlite3_total_changes sqlite3_api->total_changes
|
||||||
|
#define sqlite3_trace sqlite3_api->trace
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
|
||||||
|
#endif
|
||||||
|
#define sqlite3_update_hook sqlite3_api->update_hook
|
||||||
|
#define sqlite3_user_data sqlite3_api->user_data
|
||||||
|
#define sqlite3_value_blob sqlite3_api->value_blob
|
||||||
|
#define sqlite3_value_bytes sqlite3_api->value_bytes
|
||||||
|
#define sqlite3_value_bytes16 sqlite3_api->value_bytes16
|
||||||
|
#define sqlite3_value_double sqlite3_api->value_double
|
||||||
|
#define sqlite3_value_int sqlite3_api->value_int
|
||||||
|
#define sqlite3_value_int64 sqlite3_api->value_int64
|
||||||
|
#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
|
||||||
|
#define sqlite3_value_text sqlite3_api->value_text
|
||||||
|
#define sqlite3_value_text16 sqlite3_api->value_text16
|
||||||
|
#define sqlite3_value_text16be sqlite3_api->value_text16be
|
||||||
|
#define sqlite3_value_text16le sqlite3_api->value_text16le
|
||||||
|
#define sqlite3_value_type sqlite3_api->value_type
|
||||||
|
#define sqlite3_vmprintf sqlite3_api->vmprintf
|
||||||
|
#define sqlite3_vsnprintf sqlite3_api->xvsnprintf
|
||||||
|
#define sqlite3_overload_function sqlite3_api->overload_function
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_clear_bindings sqlite3_api->clear_bindings
|
||||||
|
#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
|
||||||
|
#define sqlite3_blob_bytes sqlite3_api->blob_bytes
|
||||||
|
#define sqlite3_blob_close sqlite3_api->blob_close
|
||||||
|
#define sqlite3_blob_open sqlite3_api->blob_open
|
||||||
|
#define sqlite3_blob_read sqlite3_api->blob_read
|
||||||
|
#define sqlite3_blob_write sqlite3_api->blob_write
|
||||||
|
#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
|
||||||
|
#define sqlite3_file_control sqlite3_api->file_control
|
||||||
|
#define sqlite3_memory_highwater sqlite3_api->memory_highwater
|
||||||
|
#define sqlite3_memory_used sqlite3_api->memory_used
|
||||||
|
#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
|
||||||
|
#define sqlite3_mutex_enter sqlite3_api->mutex_enter
|
||||||
|
#define sqlite3_mutex_free sqlite3_api->mutex_free
|
||||||
|
#define sqlite3_mutex_leave sqlite3_api->mutex_leave
|
||||||
|
#define sqlite3_mutex_try sqlite3_api->mutex_try
|
||||||
|
#define sqlite3_open_v2 sqlite3_api->open_v2
|
||||||
|
#define sqlite3_release_memory sqlite3_api->release_memory
|
||||||
|
#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
|
||||||
|
#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
|
||||||
|
#define sqlite3_sleep sqlite3_api->sleep
|
||||||
|
#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
|
||||||
|
#define sqlite3_vfs_find sqlite3_api->vfs_find
|
||||||
|
#define sqlite3_vfs_register sqlite3_api->vfs_register
|
||||||
|
#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
|
||||||
|
#define sqlite3_threadsafe sqlite3_api->xthreadsafe
|
||||||
|
#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
|
||||||
|
#define sqlite3_result_error_code sqlite3_api->result_error_code
|
||||||
|
#define sqlite3_test_control sqlite3_api->test_control
|
||||||
|
#define sqlite3_randomness sqlite3_api->randomness
|
||||||
|
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
|
||||||
|
#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
|
||||||
|
#define sqlite3_limit sqlite3_api->limit
|
||||||
|
#define sqlite3_next_stmt sqlite3_api->next_stmt
|
||||||
|
#define sqlite3_sql sqlite3_api->sql
|
||||||
|
#define sqlite3_status sqlite3_api->status
|
||||||
|
#define sqlite3_backup_finish sqlite3_api->backup_finish
|
||||||
|
#define sqlite3_backup_init sqlite3_api->backup_init
|
||||||
|
#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
|
||||||
|
#define sqlite3_backup_remaining sqlite3_api->backup_remaining
|
||||||
|
#define sqlite3_backup_step sqlite3_api->backup_step
|
||||||
|
#define sqlite3_compileoption_get sqlite3_api->compileoption_get
|
||||||
|
#define sqlite3_compileoption_used sqlite3_api->compileoption_used
|
||||||
|
#define sqlite3_create_function_v2 sqlite3_api->create_function_v2
|
||||||
|
#define sqlite3_db_config sqlite3_api->db_config
|
||||||
|
#define sqlite3_db_mutex sqlite3_api->db_mutex
|
||||||
|
#define sqlite3_db_status sqlite3_api->db_status
|
||||||
|
#define sqlite3_extended_errcode sqlite3_api->extended_errcode
|
||||||
|
#define sqlite3_log sqlite3_api->log
|
||||||
|
#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
|
||||||
|
#define sqlite3_sourceid sqlite3_api->sourceid
|
||||||
|
#define sqlite3_stmt_status sqlite3_api->stmt_status
|
||||||
|
#define sqlite3_strnicmp sqlite3_api->strnicmp
|
||||||
|
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
|
||||||
|
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
|
||||||
|
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
|
||||||
|
#define sqlite3_wal_hook sqlite3_api->wal_hook
|
||||||
|
#define sqlite3_blob_reopen sqlite3_api->blob_reopen
|
||||||
|
#define sqlite3_vtab_config sqlite3_api->vtab_config
|
||||||
|
#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
#define sqlite3_close_v2 sqlite3_api->close_v2
|
||||||
|
#define sqlite3_db_filename sqlite3_api->db_filename
|
||||||
|
#define sqlite3_db_readonly sqlite3_api->db_readonly
|
||||||
|
#define sqlite3_db_release_memory sqlite3_api->db_release_memory
|
||||||
|
#define sqlite3_errstr sqlite3_api->errstr
|
||||||
|
#define sqlite3_stmt_busy sqlite3_api->stmt_busy
|
||||||
|
#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly
|
||||||
|
#define sqlite3_stricmp sqlite3_api->stricmp
|
||||||
|
#define sqlite3_uri_boolean sqlite3_api->uri_boolean
|
||||||
|
#define sqlite3_uri_int64 sqlite3_api->uri_int64
|
||||||
|
#define sqlite3_uri_parameter sqlite3_api->uri_parameter
|
||||||
|
#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf
|
||||||
|
#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
#define sqlite3_auto_extension sqlite3_api->auto_extension
|
||||||
|
#define sqlite3_bind_blob64 sqlite3_api->bind_blob64
|
||||||
|
#define sqlite3_bind_text64 sqlite3_api->bind_text64
|
||||||
|
#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension
|
||||||
|
#define sqlite3_load_extension sqlite3_api->load_extension
|
||||||
|
#define sqlite3_malloc64 sqlite3_api->malloc64
|
||||||
|
#define sqlite3_msize sqlite3_api->msize
|
||||||
|
#define sqlite3_realloc64 sqlite3_api->realloc64
|
||||||
|
#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension
|
||||||
|
#define sqlite3_result_blob64 sqlite3_api->result_blob64
|
||||||
|
#define sqlite3_result_text64 sqlite3_api->result_text64
|
||||||
|
#define sqlite3_strglob sqlite3_api->strglob
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
#define sqlite3_value_dup sqlite3_api->value_dup
|
||||||
|
#define sqlite3_value_free sqlite3_api->value_free
|
||||||
|
#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64
|
||||||
|
#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
#define sqlite3_value_subtype sqlite3_api->value_subtype
|
||||||
|
#define sqlite3_result_subtype sqlite3_api->result_subtype
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
#define sqlite3_status64 sqlite3_api->status64
|
||||||
|
#define sqlite3_strlike sqlite3_api->strlike
|
||||||
|
#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
#define sqlite3_system_errno sqlite3_api->system_errno
|
||||||
|
/* Version 3.14.0 and later */
|
||||||
|
#define sqlite3_trace_v2 sqlite3_api->trace_v2
|
||||||
|
#define sqlite3_expanded_sql sqlite3_api->expanded_sql
|
||||||
|
/* Version 3.18.0 and later */
|
||||||
|
#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid
|
||||||
|
/* Version 3.20.0 and later */
|
||||||
|
#define sqlite3_prepare_v3 sqlite3_api->prepare_v3
|
||||||
|
#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3
|
||||||
|
#define sqlite3_bind_pointer sqlite3_api->bind_pointer
|
||||||
|
#define sqlite3_result_pointer sqlite3_api->result_pointer
|
||||||
|
#define sqlite3_value_pointer sqlite3_api->value_pointer
|
||||||
|
/* Version 3.22.0 and later */
|
||||||
|
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
|
||||||
|
#define sqlite3_value_nochange sqlite3_api->value_nochange
|
||||||
|
#define sqlite3_vtab_collation sqlite3_api->vtab_collation
|
||||||
|
/* Version 3.24.0 and later */
|
||||||
|
#define sqlite3_keyword_count sqlite3_api->keyword_count
|
||||||
|
#define sqlite3_keyword_name sqlite3_api->keyword_name
|
||||||
|
#define sqlite3_keyword_check sqlite3_api->keyword_check
|
||||||
|
#define sqlite3_str_new sqlite3_api->str_new
|
||||||
|
#define sqlite3_str_finish sqlite3_api->str_finish
|
||||||
|
#define sqlite3_str_appendf sqlite3_api->str_appendf
|
||||||
|
#define sqlite3_str_vappendf sqlite3_api->str_vappendf
|
||||||
|
#define sqlite3_str_append sqlite3_api->str_append
|
||||||
|
#define sqlite3_str_appendall sqlite3_api->str_appendall
|
||||||
|
#define sqlite3_str_appendchar sqlite3_api->str_appendchar
|
||||||
|
#define sqlite3_str_reset sqlite3_api->str_reset
|
||||||
|
#define sqlite3_str_errcode sqlite3_api->str_errcode
|
||||||
|
#define sqlite3_str_length sqlite3_api->str_length
|
||||||
|
#define sqlite3_str_value sqlite3_api->str_value
|
||||||
|
/* Version 3.25.0 and later */
|
||||||
|
#define sqlite3_create_window_function sqlite3_api->create_window_function
|
||||||
|
/* Version 3.26.0 and later */
|
||||||
|
#define sqlite3_normalized_sql sqlite3_api->normalized_sql
|
||||||
|
/* Version 3.28.0 and later */
|
||||||
|
#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain
|
||||||
|
#define sqlite3_value_frombind sqlite3_api->value_frombind
|
||||||
|
/* Version 3.30.0 and later */
|
||||||
|
#define sqlite3_drop_modules sqlite3_api->drop_modules
|
||||||
|
/* Version 3.31.0 and later */
|
||||||
|
#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64
|
||||||
|
#define sqlite3_uri_key sqlite3_api->uri_key
|
||||||
|
#define sqlite3_filename_database sqlite3_api->filename_database
|
||||||
|
#define sqlite3_filename_journal sqlite3_api->filename_journal
|
||||||
|
#define sqlite3_filename_wal sqlite3_api->filename_wal
|
||||||
|
/* Version 3.32.0 and later */
|
||||||
|
#define sqlite3_create_filename sqlite3_api->create_filename
|
||||||
|
#define sqlite3_free_filename sqlite3_api->free_filename
|
||||||
|
#define sqlite3_database_file_object sqlite3_api->database_file_object
|
||||||
|
/* Version 3.34.0 and later */
|
||||||
|
#define sqlite3_txn_state sqlite3_api->txn_state
|
||||||
|
/* Version 3.36.1 and later */
|
||||||
|
#define sqlite3_changes64 sqlite3_api->changes64
|
||||||
|
#define sqlite3_total_changes64 sqlite3_api->total_changes64
|
||||||
|
/* Version 3.37.0 and later */
|
||||||
|
#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages
|
||||||
|
/* Version 3.38.0 and later */
|
||||||
|
#define sqlite3_error_offset sqlite3_api->error_offset
|
||||||
|
#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value
|
||||||
|
#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct
|
||||||
|
#define sqlite3_vtab_in sqlite3_api->vtab_in
|
||||||
|
#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first
|
||||||
|
#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next
|
||||||
|
/* Version 3.39.0 and later */
|
||||||
|
#ifndef SQLITE_OMIT_DESERIALIZE
|
||||||
|
#define sqlite3_deserialize sqlite3_api->deserialize
|
||||||
|
#define sqlite3_serialize sqlite3_api->serialize
|
||||||
|
#endif
|
||||||
|
#define sqlite3_db_name sqlite3_api->db_name
|
||||||
|
/* Version 3.40.0 and later */
|
||||||
|
#define sqlite3_value_encoding sqlite3_api->value_encoding
|
||||||
|
/* Version 3.41.0 and later */
|
||||||
|
#define sqlite3_is_interrupted sqlite3_api->is_interrupted
|
||||||
|
/* Version 3.43.0 and later */
|
||||||
|
#define sqlite3_stmt_explain sqlite3_api->stmt_explain
|
||||||
|
/* Version 3.44.0 and later */
|
||||||
|
#define sqlite3_get_clientdata sqlite3_api->get_clientdata
|
||||||
|
#define sqlite3_set_clientdata sqlite3_api->set_clientdata
|
||||||
|
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
||||||
|
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
/* This case when the file really is being compiled as a loadable
|
||||||
|
** extension */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0;
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v;
|
||||||
|
# define SQLITE_EXTENSION_INIT3 \
|
||||||
|
extern const sqlite3_api_routines *sqlite3_api;
|
||||||
|
#else
|
||||||
|
/* This case when the file is being statically linked into the
|
||||||
|
** application */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 /*no-op*/
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */
|
||||||
|
# define SQLITE_EXTENSION_INIT3 /*no-op*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* SQLITE3EXT_H */
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+174
@@ -0,0 +1,174 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
TOOLSET := target
|
||||||
|
TARGET := better_sqlite3
|
||||||
|
DEFS_Debug := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=better_sqlite3' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DBUILDING_NODE_EXTENSION' \
|
||||||
|
'-DDEBUG' \
|
||||||
|
'-D_DEBUG' \
|
||||||
|
'-DSQLITE_DEBUG' \
|
||||||
|
'-DSQLITE_MEMDEBUG' \
|
||||||
|
'-DSQLITE_ENABLE_API_ARMOR' \
|
||||||
|
'-DSQLITE_WIN32_MALLOC_VALIDATE'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Debug := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-m64 \
|
||||||
|
-g \
|
||||||
|
-O0 \
|
||||||
|
-O0
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Debug :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Debug := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17 \
|
||||||
|
-std=c++17
|
||||||
|
|
||||||
|
INCS_Debug := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
DEFS_Release := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=better_sqlite3' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DBUILDING_NODE_EXTENSION' \
|
||||||
|
'-DNDEBUG'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Release := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-m64 \
|
||||||
|
-O3 \
|
||||||
|
-O3 \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Release :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Release := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17 \
|
||||||
|
-std=c++17
|
||||||
|
|
||||||
|
INCS_Release := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
OBJS := \
|
||||||
|
$(obj).target/$(TARGET)/src/better_sqlite3.o
|
||||||
|
|
||||||
|
# Add to the list of files we specially track dependencies for.
|
||||||
|
all_deps += $(OBJS)
|
||||||
|
|
||||||
|
# Make sure our dependencies are built before any of us.
|
||||||
|
$(OBJS): | $(builddir)/sqlite3.a $(obj).target/deps/locate_sqlite3.stamp $(obj).target/deps/sqlite3.a
|
||||||
|
|
||||||
|
# CFLAGS et al overrides must be target-local.
|
||||||
|
# See "Target-specific Variable Values" in the GNU Make manual.
|
||||||
|
$(OBJS): TOOLSET := $(TOOLSET)
|
||||||
|
$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
|
||||||
|
$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
|
||||||
|
|
||||||
|
# Suffix rules, putting all outputs into $(obj).
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
|
||||||
|
# Try building from generated source, too.
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cpp FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cxx,1)
|
||||||
|
|
||||||
|
# End of this set of suffix rules
|
||||||
|
### Rules for final target.
|
||||||
|
LDFLAGS_Debug := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-Wl,-Bsymbolic \
|
||||||
|
-Wl,--exclude-libs,ALL \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LDFLAGS_Release := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-Wl,-Bsymbolic \
|
||||||
|
-Wl,--exclude-libs,ALL \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LIBS :=
|
||||||
|
|
||||||
|
$(obj).target/better_sqlite3.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
|
||||||
|
$(obj).target/better_sqlite3.node: LIBS := $(LIBS)
|
||||||
|
$(obj).target/better_sqlite3.node: TOOLSET := $(TOOLSET)
|
||||||
|
$(obj).target/better_sqlite3.node: $(OBJS) $(obj).target/deps/sqlite3.a FORCE_DO_CMD
|
||||||
|
$(call do_cmd,solink_module)
|
||||||
|
|
||||||
|
all_deps += $(obj).target/better_sqlite3.node
|
||||||
|
# Add target alias
|
||||||
|
.PHONY: better_sqlite3
|
||||||
|
better_sqlite3: $(builddir)/better_sqlite3.node
|
||||||
|
|
||||||
|
# Copy this to the executable output path.
|
||||||
|
$(builddir)/better_sqlite3.node: TOOLSET := $(TOOLSET)
|
||||||
|
$(builddir)/better_sqlite3.node: $(obj).target/better_sqlite3.node FORCE_DO_CMD
|
||||||
|
$(call do_cmd,copy)
|
||||||
|
|
||||||
|
all_deps += $(builddir)/better_sqlite3.node
|
||||||
|
# Short alias for building this executable.
|
||||||
|
.PHONY: better_sqlite3.node
|
||||||
|
better_sqlite3.node: $(obj).target/better_sqlite3.node $(builddir)/better_sqlite3.node
|
||||||
|
|
||||||
|
# Add executable to "all" target.
|
||||||
|
.PHONY: all
|
||||||
|
all: $(builddir)/better_sqlite3.node
|
||||||
|
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
export builddir_name ?= ./build/.
|
||||||
|
.PHONY: all
|
||||||
|
all:
|
||||||
|
$(MAKE) test_extension better_sqlite3
|
||||||
+516
@@ -0,0 +1,516 @@
|
|||||||
|
# Do not edit. File was generated by node-gyp's "configure" step
|
||||||
|
{
|
||||||
|
"variables": {
|
||||||
|
"use_ccache_win": 0,
|
||||||
|
"clang": 0,
|
||||||
|
"llvm_version": "0.0",
|
||||||
|
"gas_version": "2.35",
|
||||||
|
"node_prefix": "/",
|
||||||
|
"node_install_npm": "true",
|
||||||
|
"node_install_corepack": "true",
|
||||||
|
"control_flow_guard": "false",
|
||||||
|
"node_use_amaro": "true",
|
||||||
|
"debug_node": "false",
|
||||||
|
"error_on_warn": "false",
|
||||||
|
"suppress_all_error_on_warn": "false",
|
||||||
|
"use_prefix_to_find_headers": "false",
|
||||||
|
"host_arch": "x64",
|
||||||
|
"target_arch": "x64",
|
||||||
|
"node_byteorder": "little",
|
||||||
|
"want_separate_host_toolset": 0,
|
||||||
|
"node_use_node_snapshot": "true",
|
||||||
|
"node_use_node_code_cache": "true",
|
||||||
|
"node_write_snapshot_as_array_literals": "false",
|
||||||
|
"node_enable_v8_vtunejit": "false",
|
||||||
|
"enable_pgo_generate": "false",
|
||||||
|
"enable_pgo_use": "false",
|
||||||
|
"enable_lto": "false",
|
||||||
|
"single_executable_application": "true",
|
||||||
|
"node_with_ltcg": "false",
|
||||||
|
"node_tag": "",
|
||||||
|
"node_release_urlbase": "https://nodejs.org/download/release/",
|
||||||
|
"node_debug_lib": "false",
|
||||||
|
"debug_nghttp2": "false",
|
||||||
|
"node_no_browser_globals": "false",
|
||||||
|
"node_shared": "false",
|
||||||
|
"libdir": "lib",
|
||||||
|
"node_module_version": 127,
|
||||||
|
"shlib_suffix": "so.127",
|
||||||
|
"asan": 0,
|
||||||
|
"ubsan": 0,
|
||||||
|
"coverage": "false",
|
||||||
|
"node_target_type": "executable",
|
||||||
|
"node_library_files": [
|
||||||
|
"lib/_http_agent.js",
|
||||||
|
"lib/_http_client.js",
|
||||||
|
"lib/_http_common.js",
|
||||||
|
"lib/_http_incoming.js",
|
||||||
|
"lib/_http_outgoing.js",
|
||||||
|
"lib/_http_server.js",
|
||||||
|
"lib/_stream_duplex.js",
|
||||||
|
"lib/_stream_passthrough.js",
|
||||||
|
"lib/_stream_readable.js",
|
||||||
|
"lib/_stream_transform.js",
|
||||||
|
"lib/_stream_wrap.js",
|
||||||
|
"lib/_stream_writable.js",
|
||||||
|
"lib/_tls_common.js",
|
||||||
|
"lib/_tls_wrap.js",
|
||||||
|
"lib/assert.js",
|
||||||
|
"lib/assert/strict.js",
|
||||||
|
"lib/async_hooks.js",
|
||||||
|
"lib/buffer.js",
|
||||||
|
"lib/child_process.js",
|
||||||
|
"lib/cluster.js",
|
||||||
|
"lib/console.js",
|
||||||
|
"lib/constants.js",
|
||||||
|
"lib/crypto.js",
|
||||||
|
"lib/dgram.js",
|
||||||
|
"lib/diagnostics_channel.js",
|
||||||
|
"lib/dns.js",
|
||||||
|
"lib/dns/promises.js",
|
||||||
|
"lib/domain.js",
|
||||||
|
"lib/events.js",
|
||||||
|
"lib/fs.js",
|
||||||
|
"lib/fs/promises.js",
|
||||||
|
"lib/http.js",
|
||||||
|
"lib/http2.js",
|
||||||
|
"lib/https.js",
|
||||||
|
"lib/inspector.js",
|
||||||
|
"lib/inspector/promises.js",
|
||||||
|
"lib/internal/abort_controller.js",
|
||||||
|
"lib/internal/assert.js",
|
||||||
|
"lib/internal/assert/assertion_error.js",
|
||||||
|
"lib/internal/assert/calltracker.js",
|
||||||
|
"lib/internal/assert/myers_diff.js",
|
||||||
|
"lib/internal/assert/utils.js",
|
||||||
|
"lib/internal/async_context_frame.js",
|
||||||
|
"lib/internal/async_hooks.js",
|
||||||
|
"lib/internal/async_local_storage/async_context_frame.js",
|
||||||
|
"lib/internal/async_local_storage/async_hooks.js",
|
||||||
|
"lib/internal/blob.js",
|
||||||
|
"lib/internal/blocklist.js",
|
||||||
|
"lib/internal/bootstrap/node.js",
|
||||||
|
"lib/internal/bootstrap/realm.js",
|
||||||
|
"lib/internal/bootstrap/shadow_realm.js",
|
||||||
|
"lib/internal/bootstrap/switches/does_not_own_process_state.js",
|
||||||
|
"lib/internal/bootstrap/switches/does_own_process_state.js",
|
||||||
|
"lib/internal/bootstrap/switches/is_main_thread.js",
|
||||||
|
"lib/internal/bootstrap/switches/is_not_main_thread.js",
|
||||||
|
"lib/internal/bootstrap/web/exposed-wildcard.js",
|
||||||
|
"lib/internal/bootstrap/web/exposed-window-or-worker.js",
|
||||||
|
"lib/internal/buffer.js",
|
||||||
|
"lib/internal/child_process.js",
|
||||||
|
"lib/internal/child_process/serialization.js",
|
||||||
|
"lib/internal/cli_table.js",
|
||||||
|
"lib/internal/cluster/child.js",
|
||||||
|
"lib/internal/cluster/primary.js",
|
||||||
|
"lib/internal/cluster/round_robin_handle.js",
|
||||||
|
"lib/internal/cluster/shared_handle.js",
|
||||||
|
"lib/internal/cluster/utils.js",
|
||||||
|
"lib/internal/cluster/worker.js",
|
||||||
|
"lib/internal/console/constructor.js",
|
||||||
|
"lib/internal/console/global.js",
|
||||||
|
"lib/internal/constants.js",
|
||||||
|
"lib/internal/crypto/aes.js",
|
||||||
|
"lib/internal/crypto/certificate.js",
|
||||||
|
"lib/internal/crypto/cfrg.js",
|
||||||
|
"lib/internal/crypto/cipher.js",
|
||||||
|
"lib/internal/crypto/diffiehellman.js",
|
||||||
|
"lib/internal/crypto/ec.js",
|
||||||
|
"lib/internal/crypto/hash.js",
|
||||||
|
"lib/internal/crypto/hashnames.js",
|
||||||
|
"lib/internal/crypto/hkdf.js",
|
||||||
|
"lib/internal/crypto/keygen.js",
|
||||||
|
"lib/internal/crypto/keys.js",
|
||||||
|
"lib/internal/crypto/mac.js",
|
||||||
|
"lib/internal/crypto/pbkdf2.js",
|
||||||
|
"lib/internal/crypto/random.js",
|
||||||
|
"lib/internal/crypto/rsa.js",
|
||||||
|
"lib/internal/crypto/scrypt.js",
|
||||||
|
"lib/internal/crypto/sig.js",
|
||||||
|
"lib/internal/crypto/util.js",
|
||||||
|
"lib/internal/crypto/webcrypto.js",
|
||||||
|
"lib/internal/crypto/webidl.js",
|
||||||
|
"lib/internal/crypto/x509.js",
|
||||||
|
"lib/internal/data_url.js",
|
||||||
|
"lib/internal/debugger/inspect.js",
|
||||||
|
"lib/internal/debugger/inspect_client.js",
|
||||||
|
"lib/internal/debugger/inspect_repl.js",
|
||||||
|
"lib/internal/dgram.js",
|
||||||
|
"lib/internal/dns/callback_resolver.js",
|
||||||
|
"lib/internal/dns/promises.js",
|
||||||
|
"lib/internal/dns/utils.js",
|
||||||
|
"lib/internal/encoding.js",
|
||||||
|
"lib/internal/error_serdes.js",
|
||||||
|
"lib/internal/errors.js",
|
||||||
|
"lib/internal/errors/error_source.js",
|
||||||
|
"lib/internal/event_target.js",
|
||||||
|
"lib/internal/events/abort_listener.js",
|
||||||
|
"lib/internal/events/symbols.js",
|
||||||
|
"lib/internal/file.js",
|
||||||
|
"lib/internal/fixed_queue.js",
|
||||||
|
"lib/internal/freelist.js",
|
||||||
|
"lib/internal/freeze_intrinsics.js",
|
||||||
|
"lib/internal/fs/cp/cp-sync.js",
|
||||||
|
"lib/internal/fs/cp/cp.js",
|
||||||
|
"lib/internal/fs/dir.js",
|
||||||
|
"lib/internal/fs/glob.js",
|
||||||
|
"lib/internal/fs/promises.js",
|
||||||
|
"lib/internal/fs/read/context.js",
|
||||||
|
"lib/internal/fs/recursive_watch.js",
|
||||||
|
"lib/internal/fs/rimraf.js",
|
||||||
|
"lib/internal/fs/streams.js",
|
||||||
|
"lib/internal/fs/sync_write_stream.js",
|
||||||
|
"lib/internal/fs/utils.js",
|
||||||
|
"lib/internal/fs/watchers.js",
|
||||||
|
"lib/internal/heap_utils.js",
|
||||||
|
"lib/internal/histogram.js",
|
||||||
|
"lib/internal/http.js",
|
||||||
|
"lib/internal/http2/compat.js",
|
||||||
|
"lib/internal/http2/core.js",
|
||||||
|
"lib/internal/http2/util.js",
|
||||||
|
"lib/internal/inspector/network.js",
|
||||||
|
"lib/internal/inspector/network_http.js",
|
||||||
|
"lib/internal/inspector/network_http2.js",
|
||||||
|
"lib/internal/inspector/network_resources.js",
|
||||||
|
"lib/internal/inspector/network_undici.js",
|
||||||
|
"lib/internal/inspector_async_hook.js",
|
||||||
|
"lib/internal/inspector_network_tracking.js",
|
||||||
|
"lib/internal/js_stream_socket.js",
|
||||||
|
"lib/internal/legacy/processbinding.js",
|
||||||
|
"lib/internal/linkedlist.js",
|
||||||
|
"lib/internal/main/check_syntax.js",
|
||||||
|
"lib/internal/main/embedding.js",
|
||||||
|
"lib/internal/main/eval_stdin.js",
|
||||||
|
"lib/internal/main/eval_string.js",
|
||||||
|
"lib/internal/main/inspect.js",
|
||||||
|
"lib/internal/main/mksnapshot.js",
|
||||||
|
"lib/internal/main/print_help.js",
|
||||||
|
"lib/internal/main/prof_process.js",
|
||||||
|
"lib/internal/main/repl.js",
|
||||||
|
"lib/internal/main/run_main_module.js",
|
||||||
|
"lib/internal/main/test_runner.js",
|
||||||
|
"lib/internal/main/watch_mode.js",
|
||||||
|
"lib/internal/main/worker_thread.js",
|
||||||
|
"lib/internal/mime.js",
|
||||||
|
"lib/internal/modules/cjs/loader.js",
|
||||||
|
"lib/internal/modules/customization_hooks.js",
|
||||||
|
"lib/internal/modules/esm/assert.js",
|
||||||
|
"lib/internal/modules/esm/create_dynamic_module.js",
|
||||||
|
"lib/internal/modules/esm/formats.js",
|
||||||
|
"lib/internal/modules/esm/get_format.js",
|
||||||
|
"lib/internal/modules/esm/hooks.js",
|
||||||
|
"lib/internal/modules/esm/initialize_import_meta.js",
|
||||||
|
"lib/internal/modules/esm/load.js",
|
||||||
|
"lib/internal/modules/esm/loader.js",
|
||||||
|
"lib/internal/modules/esm/module_job.js",
|
||||||
|
"lib/internal/modules/esm/module_map.js",
|
||||||
|
"lib/internal/modules/esm/resolve.js",
|
||||||
|
"lib/internal/modules/esm/shared_constants.js",
|
||||||
|
"lib/internal/modules/esm/translators.js",
|
||||||
|
"lib/internal/modules/esm/utils.js",
|
||||||
|
"lib/internal/modules/esm/worker.js",
|
||||||
|
"lib/internal/modules/helpers.js",
|
||||||
|
"lib/internal/modules/package_json_reader.js",
|
||||||
|
"lib/internal/modules/run_main.js",
|
||||||
|
"lib/internal/modules/typescript.js",
|
||||||
|
"lib/internal/navigator.js",
|
||||||
|
"lib/internal/net.js",
|
||||||
|
"lib/internal/options.js",
|
||||||
|
"lib/internal/per_context/domexception.js",
|
||||||
|
"lib/internal/per_context/messageport.js",
|
||||||
|
"lib/internal/per_context/primordials.js",
|
||||||
|
"lib/internal/perf/event_loop_delay.js",
|
||||||
|
"lib/internal/perf/event_loop_utilization.js",
|
||||||
|
"lib/internal/perf/nodetiming.js",
|
||||||
|
"lib/internal/perf/observe.js",
|
||||||
|
"lib/internal/perf/performance.js",
|
||||||
|
"lib/internal/perf/performance_entry.js",
|
||||||
|
"lib/internal/perf/resource_timing.js",
|
||||||
|
"lib/internal/perf/timerify.js",
|
||||||
|
"lib/internal/perf/usertiming.js",
|
||||||
|
"lib/internal/perf/utils.js",
|
||||||
|
"lib/internal/priority_queue.js",
|
||||||
|
"lib/internal/process/execution.js",
|
||||||
|
"lib/internal/process/finalization.js",
|
||||||
|
"lib/internal/process/per_thread.js",
|
||||||
|
"lib/internal/process/permission.js",
|
||||||
|
"lib/internal/process/pre_execution.js",
|
||||||
|
"lib/internal/process/promises.js",
|
||||||
|
"lib/internal/process/report.js",
|
||||||
|
"lib/internal/process/signal.js",
|
||||||
|
"lib/internal/process/task_queues.js",
|
||||||
|
"lib/internal/process/warning.js",
|
||||||
|
"lib/internal/process/worker_thread_only.js",
|
||||||
|
"lib/internal/promise_hooks.js",
|
||||||
|
"lib/internal/querystring.js",
|
||||||
|
"lib/internal/quic/quic.js",
|
||||||
|
"lib/internal/quic/state.js",
|
||||||
|
"lib/internal/quic/stats.js",
|
||||||
|
"lib/internal/quic/symbols.js",
|
||||||
|
"lib/internal/readline/callbacks.js",
|
||||||
|
"lib/internal/readline/emitKeypressEvents.js",
|
||||||
|
"lib/internal/readline/interface.js",
|
||||||
|
"lib/internal/readline/promises.js",
|
||||||
|
"lib/internal/readline/utils.js",
|
||||||
|
"lib/internal/repl.js",
|
||||||
|
"lib/internal/repl/await.js",
|
||||||
|
"lib/internal/repl/history.js",
|
||||||
|
"lib/internal/repl/utils.js",
|
||||||
|
"lib/internal/socket_list.js",
|
||||||
|
"lib/internal/socketaddress.js",
|
||||||
|
"lib/internal/source_map/prepare_stack_trace.js",
|
||||||
|
"lib/internal/source_map/source_map.js",
|
||||||
|
"lib/internal/source_map/source_map_cache.js",
|
||||||
|
"lib/internal/source_map/source_map_cache_map.js",
|
||||||
|
"lib/internal/stream_base_commons.js",
|
||||||
|
"lib/internal/streams/add-abort-signal.js",
|
||||||
|
"lib/internal/streams/compose.js",
|
||||||
|
"lib/internal/streams/destroy.js",
|
||||||
|
"lib/internal/streams/duplex.js",
|
||||||
|
"lib/internal/streams/duplexify.js",
|
||||||
|
"lib/internal/streams/duplexpair.js",
|
||||||
|
"lib/internal/streams/end-of-stream.js",
|
||||||
|
"lib/internal/streams/from.js",
|
||||||
|
"lib/internal/streams/lazy_transform.js",
|
||||||
|
"lib/internal/streams/legacy.js",
|
||||||
|
"lib/internal/streams/operators.js",
|
||||||
|
"lib/internal/streams/passthrough.js",
|
||||||
|
"lib/internal/streams/pipeline.js",
|
||||||
|
"lib/internal/streams/readable.js",
|
||||||
|
"lib/internal/streams/state.js",
|
||||||
|
"lib/internal/streams/transform.js",
|
||||||
|
"lib/internal/streams/utils.js",
|
||||||
|
"lib/internal/streams/writable.js",
|
||||||
|
"lib/internal/test/binding.js",
|
||||||
|
"lib/internal/test/transfer.js",
|
||||||
|
"lib/internal/test_runner/assert.js",
|
||||||
|
"lib/internal/test_runner/coverage.js",
|
||||||
|
"lib/internal/test_runner/harness.js",
|
||||||
|
"lib/internal/test_runner/mock/loader.js",
|
||||||
|
"lib/internal/test_runner/mock/mock.js",
|
||||||
|
"lib/internal/test_runner/mock/mock_timers.js",
|
||||||
|
"lib/internal/test_runner/reporter/dot.js",
|
||||||
|
"lib/internal/test_runner/reporter/junit.js",
|
||||||
|
"lib/internal/test_runner/reporter/lcov.js",
|
||||||
|
"lib/internal/test_runner/reporter/spec.js",
|
||||||
|
"lib/internal/test_runner/reporter/tap.js",
|
||||||
|
"lib/internal/test_runner/reporter/utils.js",
|
||||||
|
"lib/internal/test_runner/reporter/v8-serializer.js",
|
||||||
|
"lib/internal/test_runner/runner.js",
|
||||||
|
"lib/internal/test_runner/snapshot.js",
|
||||||
|
"lib/internal/test_runner/test.js",
|
||||||
|
"lib/internal/test_runner/tests_stream.js",
|
||||||
|
"lib/internal/test_runner/utils.js",
|
||||||
|
"lib/internal/timers.js",
|
||||||
|
"lib/internal/tls/common.js",
|
||||||
|
"lib/internal/tls/secure-context.js",
|
||||||
|
"lib/internal/tls/secure-pair.js",
|
||||||
|
"lib/internal/tls/wrap.js",
|
||||||
|
"lib/internal/trace_events_async_hooks.js",
|
||||||
|
"lib/internal/tty.js",
|
||||||
|
"lib/internal/url.js",
|
||||||
|
"lib/internal/util.js",
|
||||||
|
"lib/internal/util/colors.js",
|
||||||
|
"lib/internal/util/comparisons.js",
|
||||||
|
"lib/internal/util/debuglog.js",
|
||||||
|
"lib/internal/util/diff.js",
|
||||||
|
"lib/internal/util/inspect.js",
|
||||||
|
"lib/internal/util/inspector.js",
|
||||||
|
"lib/internal/util/parse_args/parse_args.js",
|
||||||
|
"lib/internal/util/parse_args/utils.js",
|
||||||
|
"lib/internal/util/trace_sigint.js",
|
||||||
|
"lib/internal/util/types.js",
|
||||||
|
"lib/internal/v8/startup_snapshot.js",
|
||||||
|
"lib/internal/v8_prof_polyfill.js",
|
||||||
|
"lib/internal/v8_prof_processor.js",
|
||||||
|
"lib/internal/validators.js",
|
||||||
|
"lib/internal/vm.js",
|
||||||
|
"lib/internal/vm/module.js",
|
||||||
|
"lib/internal/wasm_web_api.js",
|
||||||
|
"lib/internal/watch_mode/files_watcher.js",
|
||||||
|
"lib/internal/watchdog.js",
|
||||||
|
"lib/internal/webidl.js",
|
||||||
|
"lib/internal/webstorage.js",
|
||||||
|
"lib/internal/webstreams/adapters.js",
|
||||||
|
"lib/internal/webstreams/compression.js",
|
||||||
|
"lib/internal/webstreams/encoding.js",
|
||||||
|
"lib/internal/webstreams/queuingstrategies.js",
|
||||||
|
"lib/internal/webstreams/readablestream.js",
|
||||||
|
"lib/internal/webstreams/transfer.js",
|
||||||
|
"lib/internal/webstreams/transformstream.js",
|
||||||
|
"lib/internal/webstreams/util.js",
|
||||||
|
"lib/internal/webstreams/writablestream.js",
|
||||||
|
"lib/internal/worker.js",
|
||||||
|
"lib/internal/worker/clone_dom_exception.js",
|
||||||
|
"lib/internal/worker/io.js",
|
||||||
|
"lib/internal/worker/js_transferable.js",
|
||||||
|
"lib/internal/worker/messaging.js",
|
||||||
|
"lib/module.js",
|
||||||
|
"lib/net.js",
|
||||||
|
"lib/os.js",
|
||||||
|
"lib/path.js",
|
||||||
|
"lib/path/posix.js",
|
||||||
|
"lib/path/win32.js",
|
||||||
|
"lib/perf_hooks.js",
|
||||||
|
"lib/process.js",
|
||||||
|
"lib/punycode.js",
|
||||||
|
"lib/querystring.js",
|
||||||
|
"lib/readline.js",
|
||||||
|
"lib/readline/promises.js",
|
||||||
|
"lib/repl.js",
|
||||||
|
"lib/sea.js",
|
||||||
|
"lib/sqlite.js",
|
||||||
|
"lib/stream.js",
|
||||||
|
"lib/stream/consumers.js",
|
||||||
|
"lib/stream/promises.js",
|
||||||
|
"lib/stream/web.js",
|
||||||
|
"lib/string_decoder.js",
|
||||||
|
"lib/sys.js",
|
||||||
|
"lib/test.js",
|
||||||
|
"lib/test/reporters.js",
|
||||||
|
"lib/timers.js",
|
||||||
|
"lib/timers/promises.js",
|
||||||
|
"lib/tls.js",
|
||||||
|
"lib/trace_events.js",
|
||||||
|
"lib/tty.js",
|
||||||
|
"lib/url.js",
|
||||||
|
"lib/util.js",
|
||||||
|
"lib/util/types.js",
|
||||||
|
"lib/v8.js",
|
||||||
|
"lib/vm.js",
|
||||||
|
"lib/wasi.js",
|
||||||
|
"lib/worker_threads.js",
|
||||||
|
"lib/zlib.js"
|
||||||
|
],
|
||||||
|
"node_cctest_sources": [
|
||||||
|
"src/node_snapshot_stub.cc",
|
||||||
|
"test/cctest/inspector/test_network_requests_buffer.cc",
|
||||||
|
"test/cctest/inspector/test_node_protocol.cc",
|
||||||
|
"test/cctest/node_test_fixture.cc",
|
||||||
|
"test/cctest/test_aliased_buffer.cc",
|
||||||
|
"test/cctest/test_base64.cc",
|
||||||
|
"test/cctest/test_base_object_ptr.cc",
|
||||||
|
"test/cctest/test_cppgc.cc",
|
||||||
|
"test/cctest/test_crypto_clienthello.cc",
|
||||||
|
"test/cctest/test_dataqueue.cc",
|
||||||
|
"test/cctest/test_environment.cc",
|
||||||
|
"test/cctest/test_inspector_socket.cc",
|
||||||
|
"test/cctest/test_inspector_socket_server.cc",
|
||||||
|
"test/cctest/test_json_utils.cc",
|
||||||
|
"test/cctest/test_linked_binding.cc",
|
||||||
|
"test/cctest/test_node_api.cc",
|
||||||
|
"test/cctest/test_node_crypto.cc",
|
||||||
|
"test/cctest/test_node_crypto_env.cc",
|
||||||
|
"test/cctest/test_node_postmortem_metadata.cc",
|
||||||
|
"test/cctest/test_node_task_runner.cc",
|
||||||
|
"test/cctest/test_path.cc",
|
||||||
|
"test/cctest/test_per_process.cc",
|
||||||
|
"test/cctest/test_platform.cc",
|
||||||
|
"test/cctest/test_quic_cid.cc",
|
||||||
|
"test/cctest/test_quic_error.cc",
|
||||||
|
"test/cctest/test_quic_tokens.cc",
|
||||||
|
"test/cctest/test_report.cc",
|
||||||
|
"test/cctest/test_sockaddr.cc",
|
||||||
|
"test/cctest/test_traced_value.cc",
|
||||||
|
"test/cctest/test_util.cc",
|
||||||
|
"test/cctest/node_test_fixture.h"
|
||||||
|
],
|
||||||
|
"napi_build_version": "10",
|
||||||
|
"node_shared_zlib": "false",
|
||||||
|
"node_shared_http_parser": "false",
|
||||||
|
"node_shared_libuv": "false",
|
||||||
|
"node_shared_ada": "false",
|
||||||
|
"node_shared_simdjson": "false",
|
||||||
|
"node_shared_simdutf": "false",
|
||||||
|
"node_shared_brotli": "false",
|
||||||
|
"node_shared_cares": "false",
|
||||||
|
"node_shared_nghttp2": "false",
|
||||||
|
"node_shared_nghttp3": "false",
|
||||||
|
"node_shared_ngtcp2": "false",
|
||||||
|
"node_use_sqlite": "true",
|
||||||
|
"node_shared_sqlite": "false",
|
||||||
|
"node_shared_uvwasi": "false",
|
||||||
|
"node_shared_zstd": "false",
|
||||||
|
"v8_enable_webassembly": 1,
|
||||||
|
"v8_enable_javascript_promise_hooks": 1,
|
||||||
|
"v8_enable_lite_mode": 0,
|
||||||
|
"v8_enable_gdbjit": 0,
|
||||||
|
"v8_optimized_debug": 1,
|
||||||
|
"dcheck_always_on": 0,
|
||||||
|
"v8_enable_object_print": 1,
|
||||||
|
"v8_random_seed": 0,
|
||||||
|
"v8_promise_internal_field_count": 1,
|
||||||
|
"v8_use_siphash": 1,
|
||||||
|
"v8_enable_maglev": 0,
|
||||||
|
"v8_enable_pointer_compression": 0,
|
||||||
|
"v8_enable_sandbox": 0,
|
||||||
|
"v8_enable_pointer_compression_shared_cage": 0,
|
||||||
|
"v8_enable_external_code_space": 0,
|
||||||
|
"v8_enable_31bit_smis_on_64bit_arch": 0,
|
||||||
|
"v8_enable_shared_ro_heap": 1,
|
||||||
|
"v8_enable_extensible_ro_snapshot": 0,
|
||||||
|
"v8_trace_maps": 0,
|
||||||
|
"node_use_v8_platform": "true",
|
||||||
|
"node_use_bundled_v8": "true",
|
||||||
|
"force_dynamic_crt": 0,
|
||||||
|
"node_enable_d8": "false",
|
||||||
|
"node_enable_v8windbg": "false",
|
||||||
|
"v8_enable_hugepage": 0,
|
||||||
|
"v8_enable_short_builtin_calls": 1,
|
||||||
|
"v8_enable_wasm_simd256_revec": 1,
|
||||||
|
"node_use_openssl": "true",
|
||||||
|
"node_shared_openssl": "false",
|
||||||
|
"openssl_is_fips": "false",
|
||||||
|
"node_fipsinstall": "false",
|
||||||
|
"node_without_node_options": "false",
|
||||||
|
"openssl_quic": "false",
|
||||||
|
"icu_small": "false",
|
||||||
|
"v8_enable_i18n_support": 1,
|
||||||
|
"icu_gyp_path": "tools/icu/icu-generic.gyp",
|
||||||
|
"icu_path": "deps/icu-small",
|
||||||
|
"icu_ver_major": "78",
|
||||||
|
"icu_endianness": "l",
|
||||||
|
"icu_data_in": "../../deps/icu-tmp/icudt78l.dat",
|
||||||
|
"v8_enable_inspector": 1,
|
||||||
|
"node_section_ordering_info": "",
|
||||||
|
"node_builtin_shareable_builtins": [
|
||||||
|
"deps/cjs-module-lexer/lexer.js",
|
||||||
|
"deps/cjs-module-lexer/dist/lexer.js",
|
||||||
|
"deps/undici/undici.js",
|
||||||
|
"deps/amaro/dist/index.js"
|
||||||
|
],
|
||||||
|
"ossfuzz": "false",
|
||||||
|
"nodedir": "/root/.cache/node-gyp/22.22.2",
|
||||||
|
"python": "/usr/bin/python3",
|
||||||
|
"standalone_static_library": 1,
|
||||||
|
"global_prefix": "/usr",
|
||||||
|
"init_module": "/root/.npm-init.js",
|
||||||
|
"globalconfig": "/usr/etc/npmrc",
|
||||||
|
"node_gyp": "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
|
||||||
|
"cache": "/root/.npm",
|
||||||
|
"registry": "https://registry.npmmirror.com",
|
||||||
|
"npm_version": "10.9.7",
|
||||||
|
"prefix": "/usr",
|
||||||
|
"local_prefix": "/root/.openclaw/workspace/ssl-manager/backend",
|
||||||
|
"userconfig": "/root/.npmrc",
|
||||||
|
"user_agent": "npm/10.9.7 node/v22.22.2 linux x64 workspaces/false"
|
||||||
|
},
|
||||||
|
"target_defaults": {
|
||||||
|
"include_dirs": [],
|
||||||
|
"libraries": [],
|
||||||
|
"defines": [],
|
||||||
|
"cflags": [],
|
||||||
|
"default_configuration": "Release",
|
||||||
|
"configurations": {
|
||||||
|
"Release": {
|
||||||
|
"variables": {},
|
||||||
|
"v8_enable_v8_checks": 1
|
||||||
|
},
|
||||||
|
"Debug": {
|
||||||
|
"variables": {},
|
||||||
|
"v8_enable_v8_checks": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
TOOLSET := target
|
||||||
|
TARGET := locate_sqlite3
|
||||||
|
### Rules for action "copy_builtin_sqlite3":
|
||||||
|
quiet_cmd_deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3 = ACTION deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3 $@
|
||||||
|
cmd_deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3 = LD_LIBRARY_PATH=$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd $(srcdir)/deps; mkdir -p $(obj)/gen/sqlite3; node copy.js "$(obj)/gen/sqlite3" ""
|
||||||
|
|
||||||
|
$(obj)/gen/sqlite3/sqlite3.c: obj := $(abs_obj)
|
||||||
|
$(obj)/gen/sqlite3/sqlite3.c: builddir := $(abs_builddir)
|
||||||
|
$(obj)/gen/sqlite3/sqlite3.c: TOOLSET := $(TOOLSET)
|
||||||
|
$(obj)/gen/sqlite3/sqlite3.c $(obj)/gen/sqlite3/sqlite3.h $(obj)/gen/sqlite3/sqlite3ext.h: ba23eeee118cd63e16015df367567cb043fed872.intermediate
|
||||||
|
@:
|
||||||
|
.INTERMEDIATE: ba23eeee118cd63e16015df367567cb043fed872.intermediate
|
||||||
|
ba23eeee118cd63e16015df367567cb043fed872.intermediate: $(srcdir)/deps/sqlite3/sqlite3.c $(srcdir)/deps/sqlite3/sqlite3.h $(srcdir)/deps/sqlite3/sqlite3ext.h FORCE_DO_CMD
|
||||||
|
$(call do_cmd,touch)
|
||||||
|
$(call do_cmd,deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3)
|
||||||
|
|
||||||
|
all_deps += $(obj)/gen/sqlite3/sqlite3.c $(obj)/gen/sqlite3/sqlite3.h $(obj)/gen/sqlite3/sqlite3ext.h
|
||||||
|
action_deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3_outputs := $(obj)/gen/sqlite3/sqlite3.c $(obj)/gen/sqlite3/sqlite3.h $(obj)/gen/sqlite3/sqlite3ext.h
|
||||||
|
|
||||||
|
|
||||||
|
### Rules for final target.
|
||||||
|
# Build our special outputs first.
|
||||||
|
$(obj).target/deps/locate_sqlite3.stamp: | $(action_deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3_outputs)
|
||||||
|
|
||||||
|
# Preserve order dependency of special output on deps.
|
||||||
|
$(action_deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3_outputs): |
|
||||||
|
|
||||||
|
$(obj).target/deps/locate_sqlite3.stamp: TOOLSET := $(TOOLSET)
|
||||||
|
$(obj).target/deps/locate_sqlite3.stamp: FORCE_DO_CMD
|
||||||
|
$(call do_cmd,touch)
|
||||||
|
|
||||||
|
all_deps += $(obj).target/deps/locate_sqlite3.stamp
|
||||||
|
# Add target alias
|
||||||
|
.PHONY: locate_sqlite3
|
||||||
|
locate_sqlite3: $(obj).target/deps/locate_sqlite3.stamp
|
||||||
|
|
||||||
|
# Add target alias to "all" target.
|
||||||
|
.PHONY: all
|
||||||
|
all: locate_sqlite3
|
||||||
|
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
export builddir_name ?= ./build/deps/.
|
||||||
|
.PHONY: all
|
||||||
|
all:
|
||||||
|
$(MAKE) -C .. locate_sqlite3 sqlite3
|
||||||
+245
@@ -0,0 +1,245 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
TOOLSET := target
|
||||||
|
TARGET := sqlite3
|
||||||
|
DEFS_Debug := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=sqlite3' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DHAVE_INT16_T=1' \
|
||||||
|
'-DHAVE_INT32_T=1' \
|
||||||
|
'-DHAVE_INT8_T=1' \
|
||||||
|
'-DHAVE_STDINT_H=1' \
|
||||||
|
'-DHAVE_UINT16_T=1' \
|
||||||
|
'-DHAVE_UINT32_T=1' \
|
||||||
|
'-DHAVE_UINT8_T=1' \
|
||||||
|
'-DHAVE_USLEEP=1' \
|
||||||
|
'-DSQLITE_DEFAULT_CACHE_SIZE=-16000' \
|
||||||
|
'-DSQLITE_DEFAULT_FOREIGN_KEYS=1' \
|
||||||
|
'-DSQLITE_DEFAULT_MEMSTATUS=0' \
|
||||||
|
'-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' \
|
||||||
|
'-DSQLITE_DQS=0' \
|
||||||
|
'-DSQLITE_ENABLE_COLUMN_METADATA' \
|
||||||
|
'-DSQLITE_ENABLE_DESERIALIZE' \
|
||||||
|
'-DSQLITE_ENABLE_FTS3' \
|
||||||
|
'-DSQLITE_ENABLE_FTS3_PARENTHESIS' \
|
||||||
|
'-DSQLITE_ENABLE_FTS4' \
|
||||||
|
'-DSQLITE_ENABLE_FTS5' \
|
||||||
|
'-DSQLITE_ENABLE_GEOPOLY' \
|
||||||
|
'-DSQLITE_ENABLE_JSON1' \
|
||||||
|
'-DSQLITE_ENABLE_MATH_FUNCTIONS' \
|
||||||
|
'-DSQLITE_ENABLE_RTREE' \
|
||||||
|
'-DSQLITE_ENABLE_STAT4' \
|
||||||
|
'-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' \
|
||||||
|
'-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' \
|
||||||
|
'-DSQLITE_OMIT_DEPRECATED' \
|
||||||
|
'-DSQLITE_OMIT_PROGRESS_CALLBACK' \
|
||||||
|
'-DSQLITE_OMIT_SHARED_CACHE' \
|
||||||
|
'-DSQLITE_OMIT_TCL_VARIABLE' \
|
||||||
|
'-DSQLITE_SOUNDEX' \
|
||||||
|
'-DSQLITE_THREADSAFE=2' \
|
||||||
|
'-DSQLITE_TRACE_SIZE_LIMIT=32' \
|
||||||
|
'-DSQLITE_USE_URI=0' \
|
||||||
|
'-DDEBUG' \
|
||||||
|
'-D_DEBUG' \
|
||||||
|
'-DSQLITE_DEBUG' \
|
||||||
|
'-DSQLITE_MEMDEBUG' \
|
||||||
|
'-DSQLITE_ENABLE_API_ARMOR' \
|
||||||
|
'-DSQLITE_WIN32_MALLOC_VALIDATE'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Debug := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-std=c99 \
|
||||||
|
-w \
|
||||||
|
-m64 \
|
||||||
|
-g \
|
||||||
|
-O0 \
|
||||||
|
-O0
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Debug :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Debug := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17
|
||||||
|
|
||||||
|
INCS_Debug := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
DEFS_Release := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=sqlite3' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DHAVE_INT16_T=1' \
|
||||||
|
'-DHAVE_INT32_T=1' \
|
||||||
|
'-DHAVE_INT8_T=1' \
|
||||||
|
'-DHAVE_STDINT_H=1' \
|
||||||
|
'-DHAVE_UINT16_T=1' \
|
||||||
|
'-DHAVE_UINT32_T=1' \
|
||||||
|
'-DHAVE_UINT8_T=1' \
|
||||||
|
'-DHAVE_USLEEP=1' \
|
||||||
|
'-DSQLITE_DEFAULT_CACHE_SIZE=-16000' \
|
||||||
|
'-DSQLITE_DEFAULT_FOREIGN_KEYS=1' \
|
||||||
|
'-DSQLITE_DEFAULT_MEMSTATUS=0' \
|
||||||
|
'-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' \
|
||||||
|
'-DSQLITE_DQS=0' \
|
||||||
|
'-DSQLITE_ENABLE_COLUMN_METADATA' \
|
||||||
|
'-DSQLITE_ENABLE_DESERIALIZE' \
|
||||||
|
'-DSQLITE_ENABLE_FTS3' \
|
||||||
|
'-DSQLITE_ENABLE_FTS3_PARENTHESIS' \
|
||||||
|
'-DSQLITE_ENABLE_FTS4' \
|
||||||
|
'-DSQLITE_ENABLE_FTS5' \
|
||||||
|
'-DSQLITE_ENABLE_GEOPOLY' \
|
||||||
|
'-DSQLITE_ENABLE_JSON1' \
|
||||||
|
'-DSQLITE_ENABLE_MATH_FUNCTIONS' \
|
||||||
|
'-DSQLITE_ENABLE_RTREE' \
|
||||||
|
'-DSQLITE_ENABLE_STAT4' \
|
||||||
|
'-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' \
|
||||||
|
'-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' \
|
||||||
|
'-DSQLITE_OMIT_DEPRECATED' \
|
||||||
|
'-DSQLITE_OMIT_PROGRESS_CALLBACK' \
|
||||||
|
'-DSQLITE_OMIT_SHARED_CACHE' \
|
||||||
|
'-DSQLITE_OMIT_TCL_VARIABLE' \
|
||||||
|
'-DSQLITE_SOUNDEX' \
|
||||||
|
'-DSQLITE_THREADSAFE=2' \
|
||||||
|
'-DSQLITE_TRACE_SIZE_LIMIT=32' \
|
||||||
|
'-DSQLITE_USE_URI=0' \
|
||||||
|
'-DNDEBUG'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Release := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-std=c99 \
|
||||||
|
-w \
|
||||||
|
-m64 \
|
||||||
|
-O3 \
|
||||||
|
-O3 \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Release :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Release := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17
|
||||||
|
|
||||||
|
INCS_Release := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
OBJS := \
|
||||||
|
$(obj).target/$(TARGET)/gen/sqlite3/sqlite3.o
|
||||||
|
|
||||||
|
# Add to the list of files we specially track dependencies for.
|
||||||
|
all_deps += $(OBJS)
|
||||||
|
|
||||||
|
# Make sure our dependencies are built before any of us.
|
||||||
|
$(OBJS): | $(obj).target/deps/locate_sqlite3.stamp
|
||||||
|
|
||||||
|
# CFLAGS et al overrides must be target-local.
|
||||||
|
# See "Target-specific Variable Values" in the GNU Make manual.
|
||||||
|
$(OBJS): TOOLSET := $(TOOLSET)
|
||||||
|
$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
|
||||||
|
$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
|
||||||
|
|
||||||
|
# Suffix rules, putting all outputs into $(obj).
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
# Try building from generated source, too.
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
# End of this set of suffix rules
|
||||||
|
### Rules for final target.
|
||||||
|
LDFLAGS_Debug := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LDFLAGS_Release := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LIBS :=
|
||||||
|
|
||||||
|
$(obj).target/deps/sqlite3.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
|
||||||
|
$(obj).target/deps/sqlite3.a: LIBS := $(LIBS)
|
||||||
|
$(obj).target/deps/sqlite3.a: TOOLSET := $(TOOLSET)
|
||||||
|
$(obj).target/deps/sqlite3.a: $(OBJS)
|
||||||
|
$(call create_archive,$@,$^)
|
||||||
|
|
||||||
|
# Add target alias
|
||||||
|
.PHONY: sqlite3
|
||||||
|
sqlite3: $(obj).target/deps/sqlite3.a
|
||||||
|
|
||||||
|
# Add target alias to "all" target.
|
||||||
|
.PHONY: all
|
||||||
|
all: sqlite3
|
||||||
|
|
||||||
|
# Add target alias
|
||||||
|
.PHONY: sqlite3
|
||||||
|
sqlite3: $(builddir)/sqlite3.a
|
||||||
|
|
||||||
|
# Copy this to the static library output path.
|
||||||
|
$(builddir)/sqlite3.a: TOOLSET := $(TOOLSET)
|
||||||
|
$(builddir)/sqlite3.a: $(obj).target/deps/sqlite3.a FORCE_DO_CMD
|
||||||
|
$(call do_cmd,copy)
|
||||||
|
|
||||||
|
all_deps += $(builddir)/sqlite3.a
|
||||||
|
# Short alias for building this static library.
|
||||||
|
.PHONY: sqlite3.a
|
||||||
|
sqlite3.a: $(obj).target/deps/sqlite3.a $(builddir)/sqlite3.a
|
||||||
|
|
||||||
|
# Add static library to "all" target.
|
||||||
|
.PHONY: all
|
||||||
|
all: $(builddir)/sqlite3.a
|
||||||
|
|
||||||
+168
@@ -0,0 +1,168 @@
|
|||||||
|
# This file is generated by gyp; do not edit.
|
||||||
|
|
||||||
|
TOOLSET := target
|
||||||
|
TARGET := test_extension
|
||||||
|
DEFS_Debug := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=test_extension' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DBUILDING_NODE_EXTENSION' \
|
||||||
|
'-DDEBUG' \
|
||||||
|
'-D_DEBUG' \
|
||||||
|
'-DSQLITE_DEBUG' \
|
||||||
|
'-DSQLITE_MEMDEBUG' \
|
||||||
|
'-DSQLITE_ENABLE_API_ARMOR' \
|
||||||
|
'-DSQLITE_WIN32_MALLOC_VALIDATE'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Debug := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-m64 \
|
||||||
|
-g \
|
||||||
|
-O0 \
|
||||||
|
-O0
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Debug :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Debug := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17
|
||||||
|
|
||||||
|
INCS_Debug := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
DEFS_Release := \
|
||||||
|
'-DNODE_GYP_MODULE_NAME=test_extension' \
|
||||||
|
'-DUSING_UV_SHARED=1' \
|
||||||
|
'-DUSING_V8_SHARED=1' \
|
||||||
|
'-DV8_DEPRECATION_WARNINGS=1' \
|
||||||
|
'-D_GLIBCXX_USE_CXX11_ABI=1' \
|
||||||
|
'-D_FILE_OFFSET_BITS=64' \
|
||||||
|
'-D_LARGEFILE_SOURCE' \
|
||||||
|
'-D__STDC_FORMAT_MACROS' \
|
||||||
|
'-DOPENSSL_NO_PINSHARED' \
|
||||||
|
'-DOPENSSL_THREADS' \
|
||||||
|
'-DBUILDING_NODE_EXTENSION' \
|
||||||
|
'-DNDEBUG'
|
||||||
|
|
||||||
|
# Flags passed to all source files.
|
||||||
|
CFLAGS_Release := \
|
||||||
|
-fPIC \
|
||||||
|
-pthread \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-m64 \
|
||||||
|
-O3 \
|
||||||
|
-O3 \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
|
|
||||||
|
# Flags passed to only C files.
|
||||||
|
CFLAGS_C_Release :=
|
||||||
|
|
||||||
|
# Flags passed to only C++ files.
|
||||||
|
CFLAGS_CC_Release := \
|
||||||
|
-fno-rtti \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-std=gnu++17
|
||||||
|
|
||||||
|
INCS_Release := \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/include/node \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/src \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/config \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/openssl/openssl/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/uv/include \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/zlib \
|
||||||
|
-I/root/.cache/node-gyp/22.22.2/deps/v8/include \
|
||||||
|
-I$(obj)/gen/sqlite3
|
||||||
|
|
||||||
|
OBJS := \
|
||||||
|
$(obj).target/$(TARGET)/deps/test_extension.o
|
||||||
|
|
||||||
|
# Add to the list of files we specially track dependencies for.
|
||||||
|
all_deps += $(OBJS)
|
||||||
|
|
||||||
|
# Make sure our dependencies are built before any of us.
|
||||||
|
$(OBJS): | $(builddir)/sqlite3.a $(obj).target/deps/locate_sqlite3.stamp $(obj).target/deps/sqlite3.a
|
||||||
|
|
||||||
|
# CFLAGS et al overrides must be target-local.
|
||||||
|
# See "Target-specific Variable Values" in the GNU Make manual.
|
||||||
|
$(OBJS): TOOLSET := $(TOOLSET)
|
||||||
|
$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
|
||||||
|
$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
|
||||||
|
|
||||||
|
# Suffix rules, putting all outputs into $(obj).
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
# Try building from generated source, too.
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.c FORCE_DO_CMD
|
||||||
|
@$(call do_cmd,cc,1)
|
||||||
|
|
||||||
|
# End of this set of suffix rules
|
||||||
|
### Rules for final target.
|
||||||
|
LDFLAGS_Debug := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LDFLAGS_Release := \
|
||||||
|
-pthread \
|
||||||
|
-rdynamic \
|
||||||
|
-m64
|
||||||
|
|
||||||
|
LIBS :=
|
||||||
|
|
||||||
|
$(obj).target/test_extension.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
|
||||||
|
$(obj).target/test_extension.node: LIBS := $(LIBS)
|
||||||
|
$(obj).target/test_extension.node: TOOLSET := $(TOOLSET)
|
||||||
|
$(obj).target/test_extension.node: $(OBJS) $(obj).target/deps/sqlite3.a FORCE_DO_CMD
|
||||||
|
$(call do_cmd,solink_module)
|
||||||
|
|
||||||
|
all_deps += $(obj).target/test_extension.node
|
||||||
|
# Add target alias
|
||||||
|
.PHONY: test_extension
|
||||||
|
test_extension: $(builddir)/test_extension.node
|
||||||
|
|
||||||
|
# Copy this to the executable output path.
|
||||||
|
$(builddir)/test_extension.node: TOOLSET := $(TOOLSET)
|
||||||
|
$(builddir)/test_extension.node: $(obj).target/test_extension.node FORCE_DO_CMD
|
||||||
|
$(call do_cmd,copy)
|
||||||
|
|
||||||
|
all_deps += $(builddir)/test_extension.node
|
||||||
|
# Short alias for building this executable.
|
||||||
|
.PHONY: test_extension.node
|
||||||
|
test_extension.node: $(obj).target/test_extension.node $(builddir)/test_extension.node
|
||||||
|
|
||||||
|
# Add executable to "all" target.
|
||||||
|
.PHONY: all
|
||||||
|
all: $(builddir)/test_extension.node
|
||||||
|
|
||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
# ===
|
||||||
|
# This configuration defines the differences between Release and Debug builds.
|
||||||
|
# Some miscellaneous Windows settings are also defined here.
|
||||||
|
# ===
|
||||||
|
|
||||||
|
{
|
||||||
|
'variables': { 'sqlite3%': '' },
|
||||||
|
'target_defaults': {
|
||||||
|
'default_configuration': 'Release',
|
||||||
|
'msvs_settings': {
|
||||||
|
'VCCLCompilerTool': {
|
||||||
|
'ExceptionHandling': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'conditions': [
|
||||||
|
['OS == "win"', {
|
||||||
|
'defines': ['WIN32'],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
'configurations': {
|
||||||
|
'Debug': {
|
||||||
|
'defines!': [
|
||||||
|
'NDEBUG',
|
||||||
|
],
|
||||||
|
'defines': [
|
||||||
|
'DEBUG',
|
||||||
|
'_DEBUG',
|
||||||
|
'SQLITE_DEBUG',
|
||||||
|
'SQLITE_MEMDEBUG',
|
||||||
|
'SQLITE_ENABLE_API_ARMOR',
|
||||||
|
'SQLITE_WIN32_MALLOC_VALIDATE',
|
||||||
|
],
|
||||||
|
'cflags': [
|
||||||
|
'-O0',
|
||||||
|
],
|
||||||
|
'xcode_settings': {
|
||||||
|
'MACOSX_DEPLOYMENT_TARGET': '10.7',
|
||||||
|
'GCC_OPTIMIZATION_LEVEL': '0',
|
||||||
|
'GCC_GENERATE_DEBUGGING_SYMBOLS': 'YES',
|
||||||
|
},
|
||||||
|
'msvs_settings': {
|
||||||
|
'VCLinkerTool': {
|
||||||
|
'GenerateDebugInformation': 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'Release': {
|
||||||
|
'defines!': [
|
||||||
|
'DEBUG',
|
||||||
|
'_DEBUG',
|
||||||
|
],
|
||||||
|
'defines': [
|
||||||
|
'NDEBUG',
|
||||||
|
],
|
||||||
|
'cflags': [
|
||||||
|
'-O3',
|
||||||
|
],
|
||||||
|
'xcode_settings': {
|
||||||
|
'MACOSX_DEPLOYMENT_TARGET': '10.7',
|
||||||
|
'GCC_OPTIMIZATION_LEVEL': '3',
|
||||||
|
'GCC_GENERATE_DEBUGGING_SYMBOLS': 'NO',
|
||||||
|
'DEAD_CODE_STRIPPING': 'YES',
|
||||||
|
'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
'use strict';
|
||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const dest = process.argv[2];
|
||||||
|
const source = path.resolve(path.sep, process.argv[3] || path.join(__dirname, 'sqlite3'));
|
||||||
|
const files = [
|
||||||
|
{ filename: 'sqlite3.c', optional: false },
|
||||||
|
{ filename: 'sqlite3.h', optional: false },
|
||||||
|
];
|
||||||
|
|
||||||
|
if (process.argv[3]) {
|
||||||
|
// Support "_HAVE_SQLITE_CONFIG_H" in custom builds.
|
||||||
|
files.push({ filename: 'config.h', optional: true });
|
||||||
|
} else {
|
||||||
|
// Required for some tests.
|
||||||
|
files.push({ filename: 'sqlite3ext.h', optional: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const { filename, optional } of files) {
|
||||||
|
const sourceFilepath = path.join(source, filename);
|
||||||
|
const destFilepath = path.join(dest, filename);
|
||||||
|
|
||||||
|
if (optional && !fs.existsSync(sourceFilepath)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.accessSync(sourceFilepath);
|
||||||
|
fs.mkdirSync(path.dirname(destFilepath), { recursive: true });
|
||||||
|
fs.copyFileSync(sourceFilepath, destFilepath);
|
||||||
|
}
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
# THIS FILE IS AUTOMATICALLY GENERATED BY deps/download.sh (DO NOT EDIT)
|
||||||
|
|
||||||
|
{
|
||||||
|
'defines': [
|
||||||
|
'HAVE_INT16_T=1',
|
||||||
|
'HAVE_INT32_T=1',
|
||||||
|
'HAVE_INT8_T=1',
|
||||||
|
'HAVE_STDINT_H=1',
|
||||||
|
'HAVE_UINT16_T=1',
|
||||||
|
'HAVE_UINT32_T=1',
|
||||||
|
'HAVE_UINT8_T=1',
|
||||||
|
'HAVE_USLEEP=1',
|
||||||
|
'SQLITE_DEFAULT_CACHE_SIZE=-16000',
|
||||||
|
'SQLITE_DEFAULT_FOREIGN_KEYS=1',
|
||||||
|
'SQLITE_DEFAULT_MEMSTATUS=0',
|
||||||
|
'SQLITE_DEFAULT_WAL_SYNCHRONOUS=1',
|
||||||
|
'SQLITE_DQS=0',
|
||||||
|
'SQLITE_ENABLE_COLUMN_METADATA',
|
||||||
|
'SQLITE_ENABLE_DESERIALIZE',
|
||||||
|
'SQLITE_ENABLE_FTS3',
|
||||||
|
'SQLITE_ENABLE_FTS3_PARENTHESIS',
|
||||||
|
'SQLITE_ENABLE_FTS4',
|
||||||
|
'SQLITE_ENABLE_FTS5',
|
||||||
|
'SQLITE_ENABLE_GEOPOLY',
|
||||||
|
'SQLITE_ENABLE_JSON1',
|
||||||
|
'SQLITE_ENABLE_MATH_FUNCTIONS',
|
||||||
|
'SQLITE_ENABLE_RTREE',
|
||||||
|
'SQLITE_ENABLE_STAT4',
|
||||||
|
'SQLITE_ENABLE_UPDATE_DELETE_LIMIT',
|
||||||
|
'SQLITE_LIKE_DOESNT_MATCH_BLOBS',
|
||||||
|
'SQLITE_OMIT_DEPRECATED',
|
||||||
|
'SQLITE_OMIT_PROGRESS_CALLBACK',
|
||||||
|
'SQLITE_OMIT_SHARED_CACHE',
|
||||||
|
'SQLITE_OMIT_TCL_VARIABLE',
|
||||||
|
'SQLITE_SOUNDEX',
|
||||||
|
'SQLITE_THREADSAFE=2',
|
||||||
|
'SQLITE_TRACE_SIZE_LIMIT=32',
|
||||||
|
'SQLITE_USE_URI=0',
|
||||||
|
],
|
||||||
|
}
|
||||||
+112
@@ -0,0 +1,112 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# ===
|
||||||
|
# This script defines and generates the bundled SQLite3 unit (sqlite3.c).
|
||||||
|
#
|
||||||
|
# The following steps are taken:
|
||||||
|
# 1. populate the shell environment with the defined compile-time options.
|
||||||
|
# 2. download and extract the SQLite3 source code into a temporary directory.
|
||||||
|
# 3. run "sh configure" and "make sqlite3.c" within the source directory.
|
||||||
|
# 4. copy the generated amalgamation into the output directory (./sqlite3).
|
||||||
|
# 5. export the defined compile-time options to a gyp file (./defines.gypi).
|
||||||
|
# 6. update the docs (../docs/compilation.md) with details of this distribution.
|
||||||
|
#
|
||||||
|
# When a user builds better-sqlite3, the following steps are taken:
|
||||||
|
# 1. node-gyp loads the previously exported compile-time options (defines.gypi).
|
||||||
|
# 2. the copy.js script copies the bundled amalgamation into the build folder.
|
||||||
|
# 3. node-gyp compiles the copied sqlite3.c along with better_sqlite3.cpp.
|
||||||
|
# 4. node-gyp links the two resulting binaries to generate better_sqlite3.node.
|
||||||
|
# ===
|
||||||
|
|
||||||
|
YEAR="2024"
|
||||||
|
VERSION="3450300"
|
||||||
|
|
||||||
|
# Defines below are sorted alphabetically
|
||||||
|
DEFINES="
|
||||||
|
HAVE_INT16_T=1
|
||||||
|
HAVE_INT32_T=1
|
||||||
|
HAVE_INT8_T=1
|
||||||
|
HAVE_STDINT_H=1
|
||||||
|
HAVE_UINT16_T=1
|
||||||
|
HAVE_UINT32_T=1
|
||||||
|
HAVE_UINT8_T=1
|
||||||
|
HAVE_USLEEP=1
|
||||||
|
SQLITE_DEFAULT_CACHE_SIZE=-16000
|
||||||
|
SQLITE_DEFAULT_FOREIGN_KEYS=1
|
||||||
|
SQLITE_DEFAULT_MEMSTATUS=0
|
||||||
|
SQLITE_DEFAULT_WAL_SYNCHRONOUS=1
|
||||||
|
SQLITE_DQS=0
|
||||||
|
SQLITE_ENABLE_COLUMN_METADATA
|
||||||
|
SQLITE_ENABLE_DESERIALIZE
|
||||||
|
SQLITE_ENABLE_FTS3
|
||||||
|
SQLITE_ENABLE_FTS3_PARENTHESIS
|
||||||
|
SQLITE_ENABLE_FTS4
|
||||||
|
SQLITE_ENABLE_FTS5
|
||||||
|
SQLITE_ENABLE_GEOPOLY
|
||||||
|
SQLITE_ENABLE_JSON1
|
||||||
|
SQLITE_ENABLE_MATH_FUNCTIONS
|
||||||
|
SQLITE_ENABLE_RTREE
|
||||||
|
SQLITE_ENABLE_STAT4
|
||||||
|
SQLITE_ENABLE_UPDATE_DELETE_LIMIT
|
||||||
|
SQLITE_LIKE_DOESNT_MATCH_BLOBS
|
||||||
|
SQLITE_OMIT_DEPRECATED
|
||||||
|
SQLITE_OMIT_PROGRESS_CALLBACK
|
||||||
|
SQLITE_OMIT_SHARED_CACHE
|
||||||
|
SQLITE_OMIT_TCL_VARIABLE
|
||||||
|
SQLITE_SOUNDEX
|
||||||
|
SQLITE_THREADSAFE=2
|
||||||
|
SQLITE_TRACE_SIZE_LIMIT=32
|
||||||
|
SQLITE_USE_URI=0
|
||||||
|
"
|
||||||
|
|
||||||
|
# ========== START SCRIPT ========== #
|
||||||
|
|
||||||
|
echo "setting up environment..."
|
||||||
|
DEPS="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
||||||
|
TEMP="$DEPS/temp"
|
||||||
|
OUTPUT="$DEPS/sqlite3"
|
||||||
|
rm -rf "$TEMP"
|
||||||
|
rm -rf "$OUTPUT"
|
||||||
|
mkdir -p "$TEMP"
|
||||||
|
mkdir -p "$OUTPUT"
|
||||||
|
export CFLAGS=`echo $(echo "$DEFINES" | sed -e "/^\s*$/d" -e "s/^/-D/")`
|
||||||
|
|
||||||
|
echo "downloading source..."
|
||||||
|
curl -#f "https://www.sqlite.org/$YEAR/sqlite-src-$VERSION.zip" > "$TEMP/source.zip" || exit 1
|
||||||
|
|
||||||
|
echo "extracting source..."
|
||||||
|
unzip "$TEMP/source.zip" -d "$TEMP" > /dev/null || exit 1
|
||||||
|
cd "$TEMP/sqlite-src-$VERSION" || exit 1
|
||||||
|
|
||||||
|
echo "configuring amalgamation..."
|
||||||
|
sh configure > /dev/null || exit 1
|
||||||
|
|
||||||
|
echo "building amalgamation..."
|
||||||
|
make sqlite3.c > /dev/null || exit 1
|
||||||
|
|
||||||
|
echo "copying amalgamation..."
|
||||||
|
cp sqlite3.c sqlite3.h sqlite3ext.h "$OUTPUT/" || exit 1
|
||||||
|
|
||||||
|
echo "updating gyp configs..."
|
||||||
|
GYP="$DEPS/defines.gypi"
|
||||||
|
printf "# THIS FILE IS AUTOMATICALLY GENERATED BY deps/download.sh (DO NOT EDIT)\n\n{\n 'defines': [\n" > "$GYP"
|
||||||
|
printf "$DEFINES" | sed -e "/^\s*$/d" -e "s/\(.*\)/ '\1',/" >> "$GYP"
|
||||||
|
printf " ],\n}\n" >> "$GYP"
|
||||||
|
|
||||||
|
echo "updating docs..."
|
||||||
|
DOCS="$DEPS/../docs/compilation.md"
|
||||||
|
MAJOR=`expr "${VERSION:0:1}" + 0`
|
||||||
|
MINOR=`expr "${VERSION:1:2}" + 0`
|
||||||
|
PATCH=`expr "${VERSION:3:2}" + 0`
|
||||||
|
sed -Ei.bak -e "s/version [0-9]+\.[0-9]+\.[0-9]+/version $MAJOR.$MINOR.$PATCH/g" "$DOCS"
|
||||||
|
sed -i.bak -e "/^SQLITE_/,\$d" "$DOCS"
|
||||||
|
sed -i.bak -e "/^HAVE_/,\$d" "$DOCS"
|
||||||
|
rm "$DOCS".bak
|
||||||
|
printf "$DEFINES" | sed -e "/^\s*$/d" >> "$DOCS"
|
||||||
|
printf "\`\`\`\n" >> "$DOCS"
|
||||||
|
|
||||||
|
echo "cleaning up..."
|
||||||
|
cd - > /dev/null || exit 1
|
||||||
|
rm -rf "$TEMP"
|
||||||
|
|
||||||
|
echo "done!"
|
||||||
+80
@@ -0,0 +1,80 @@
|
|||||||
|
# ===
|
||||||
|
# This configuration defines options specific to compiling SQLite3 itself.
|
||||||
|
# Compile-time options are loaded by the auto-generated file "defines.gypi".
|
||||||
|
# The --sqlite3 option can be provided to use a custom amalgamation instead.
|
||||||
|
# ===
|
||||||
|
|
||||||
|
{
|
||||||
|
'includes': ['common.gypi'],
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'locate_sqlite3',
|
||||||
|
'type': 'none',
|
||||||
|
'hard_dependency': 1,
|
||||||
|
'conditions': [
|
||||||
|
['sqlite3 == ""', {
|
||||||
|
'actions': [{
|
||||||
|
'action_name': 'copy_builtin_sqlite3',
|
||||||
|
'inputs': [
|
||||||
|
'sqlite3/sqlite3.c',
|
||||||
|
'sqlite3/sqlite3.h',
|
||||||
|
'sqlite3/sqlite3ext.h',
|
||||||
|
],
|
||||||
|
'outputs': [
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3.c',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3.h',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3ext.h',
|
||||||
|
],
|
||||||
|
'action': ['node', 'copy.js', '<(SHARED_INTERMEDIATE_DIR)/sqlite3', ''],
|
||||||
|
}],
|
||||||
|
}, {
|
||||||
|
'actions': [{
|
||||||
|
'action_name': 'copy_custom_sqlite3',
|
||||||
|
'inputs': [
|
||||||
|
'<(sqlite3)/sqlite3.c',
|
||||||
|
'<(sqlite3)/sqlite3.h',
|
||||||
|
],
|
||||||
|
'outputs': [
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3.c',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3.h',
|
||||||
|
],
|
||||||
|
'action': ['node', 'copy.js', '<(SHARED_INTERMEDIATE_DIR)/sqlite3', '<(sqlite3)'],
|
||||||
|
}],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'target_name': 'sqlite3',
|
||||||
|
'type': 'static_library',
|
||||||
|
'dependencies': ['locate_sqlite3'],
|
||||||
|
'sources': ['<(SHARED_INTERMEDIATE_DIR)/sqlite3/sqlite3.c'],
|
||||||
|
'include_dirs': ['<(SHARED_INTERMEDIATE_DIR)/sqlite3/'],
|
||||||
|
'direct_dependent_settings': {
|
||||||
|
'include_dirs': ['<(SHARED_INTERMEDIATE_DIR)/sqlite3/'],
|
||||||
|
},
|
||||||
|
'cflags': ['-std=c99', '-w'],
|
||||||
|
'xcode_settings': {
|
||||||
|
'OTHER_CFLAGS': ['-std=c99'],
|
||||||
|
'WARNING_CFLAGS': ['-w'],
|
||||||
|
},
|
||||||
|
'conditions': [
|
||||||
|
['sqlite3 == ""', {
|
||||||
|
'includes': ['defines.gypi'],
|
||||||
|
}, {
|
||||||
|
'defines': [
|
||||||
|
# This is currently required by better-sqlite3.
|
||||||
|
'SQLITE_ENABLE_COLUMN_METADATA',
|
||||||
|
],
|
||||||
|
}]
|
||||||
|
],
|
||||||
|
'configurations': {
|
||||||
|
'Debug': {
|
||||||
|
'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 1 } }, # static debug
|
||||||
|
},
|
||||||
|
'Release': {
|
||||||
|
'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 0 } }, # static release
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
+255954
File diff suppressed because it is too large
Load Diff
+13374
File diff suppressed because it is too large
Load Diff
+719
@@ -0,0 +1,719 @@
|
|||||||
|
/*
|
||||||
|
** 2006 June 7
|
||||||
|
**
|
||||||
|
** The author disclaims copyright to this source code. In place of
|
||||||
|
** a legal notice, here is a blessing:
|
||||||
|
**
|
||||||
|
** May you do good and not evil.
|
||||||
|
** May you find forgiveness for yourself and forgive others.
|
||||||
|
** May you share freely, never taking more than you give.
|
||||||
|
**
|
||||||
|
*************************************************************************
|
||||||
|
** This header file defines the SQLite interface for use by
|
||||||
|
** shared libraries that want to be imported as extensions into
|
||||||
|
** an SQLite instance. Shared libraries that intend to be loaded
|
||||||
|
** as extensions by SQLite should #include this file instead of
|
||||||
|
** sqlite3.h.
|
||||||
|
*/
|
||||||
|
#ifndef SQLITE3EXT_H
|
||||||
|
#define SQLITE3EXT_H
|
||||||
|
#include "sqlite3.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following structure holds pointers to all of the SQLite API
|
||||||
|
** routines.
|
||||||
|
**
|
||||||
|
** WARNING: In order to maintain backwards compatibility, add new
|
||||||
|
** interfaces to the end of this structure only. If you insert new
|
||||||
|
** interfaces in the middle of this structure, then older different
|
||||||
|
** versions of SQLite will not be able to load each other's shared
|
||||||
|
** libraries!
|
||||||
|
*/
|
||||||
|
struct sqlite3_api_routines {
|
||||||
|
void * (*aggregate_context)(sqlite3_context*,int nBytes);
|
||||||
|
int (*aggregate_count)(sqlite3_context*);
|
||||||
|
int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
|
||||||
|
int (*bind_double)(sqlite3_stmt*,int,double);
|
||||||
|
int (*bind_int)(sqlite3_stmt*,int,int);
|
||||||
|
int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
|
||||||
|
int (*bind_null)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_parameter_count)(sqlite3_stmt*);
|
||||||
|
int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
|
||||||
|
const char * (*bind_parameter_name)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
|
||||||
|
int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
|
||||||
|
int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
|
||||||
|
int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
|
||||||
|
int (*busy_timeout)(sqlite3*,int ms);
|
||||||
|
int (*changes)(sqlite3*);
|
||||||
|
int (*close)(sqlite3*);
|
||||||
|
int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const char*));
|
||||||
|
int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const void*));
|
||||||
|
const void * (*column_blob)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_count)(sqlite3_stmt*pStmt);
|
||||||
|
const char * (*column_database_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_database_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_decltype)(sqlite3_stmt*,int i);
|
||||||
|
const void * (*column_decltype16)(sqlite3_stmt*,int);
|
||||||
|
double (*column_double)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_int)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
|
||||||
|
const char * (*column_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_origin_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_origin_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_table_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_table_name16)(sqlite3_stmt*,int);
|
||||||
|
const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
|
||||||
|
const void * (*column_text16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_type)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
|
||||||
|
void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
|
||||||
|
int (*complete)(const char*sql);
|
||||||
|
int (*complete16)(const void*sql);
|
||||||
|
int (*create_collation)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_collation16)(sqlite3*,const void*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_function)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_function16)(sqlite3*,const void*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
|
||||||
|
int (*data_count)(sqlite3_stmt*pStmt);
|
||||||
|
sqlite3 * (*db_handle)(sqlite3_stmt*);
|
||||||
|
int (*declare_vtab)(sqlite3*,const char*);
|
||||||
|
int (*enable_shared_cache)(int);
|
||||||
|
int (*errcode)(sqlite3*db);
|
||||||
|
const char * (*errmsg)(sqlite3*);
|
||||||
|
const void * (*errmsg16)(sqlite3*);
|
||||||
|
int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
|
||||||
|
int (*expired)(sqlite3_stmt*);
|
||||||
|
int (*finalize)(sqlite3_stmt*pStmt);
|
||||||
|
void (*free)(void*);
|
||||||
|
void (*free_table)(char**result);
|
||||||
|
int (*get_autocommit)(sqlite3*);
|
||||||
|
void * (*get_auxdata)(sqlite3_context*,int);
|
||||||
|
int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
|
||||||
|
int (*global_recover)(void);
|
||||||
|
void (*interruptx)(sqlite3*);
|
||||||
|
sqlite_int64 (*last_insert_rowid)(sqlite3*);
|
||||||
|
const char * (*libversion)(void);
|
||||||
|
int (*libversion_number)(void);
|
||||||
|
void *(*malloc)(int);
|
||||||
|
char * (*mprintf)(const char*,...);
|
||||||
|
int (*open)(const char*,sqlite3**);
|
||||||
|
int (*open16)(const void*,sqlite3**);
|
||||||
|
int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
|
||||||
|
void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
|
||||||
|
void *(*realloc)(void*,int);
|
||||||
|
int (*reset)(sqlite3_stmt*pStmt);
|
||||||
|
void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_double)(sqlite3_context*,double);
|
||||||
|
void (*result_error)(sqlite3_context*,const char*,int);
|
||||||
|
void (*result_error16)(sqlite3_context*,const void*,int);
|
||||||
|
void (*result_int)(sqlite3_context*,int);
|
||||||
|
void (*result_int64)(sqlite3_context*,sqlite_int64);
|
||||||
|
void (*result_null)(sqlite3_context*);
|
||||||
|
void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
|
||||||
|
void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_value)(sqlite3_context*,sqlite3_value*);
|
||||||
|
void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
|
||||||
|
int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
|
||||||
|
const char*,const char*),void*);
|
||||||
|
void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
|
||||||
|
char * (*xsnprintf)(int,char*,const char*,...);
|
||||||
|
int (*step)(sqlite3_stmt*);
|
||||||
|
int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
|
||||||
|
char const**,char const**,int*,int*,int*);
|
||||||
|
void (*thread_cleanup)(void);
|
||||||
|
int (*total_changes)(sqlite3*);
|
||||||
|
void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
|
||||||
|
int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
|
||||||
|
void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
|
||||||
|
sqlite_int64),void*);
|
||||||
|
void * (*user_data)(sqlite3_context*);
|
||||||
|
const void * (*value_blob)(sqlite3_value*);
|
||||||
|
int (*value_bytes)(sqlite3_value*);
|
||||||
|
int (*value_bytes16)(sqlite3_value*);
|
||||||
|
double (*value_double)(sqlite3_value*);
|
||||||
|
int (*value_int)(sqlite3_value*);
|
||||||
|
sqlite_int64 (*value_int64)(sqlite3_value*);
|
||||||
|
int (*value_numeric_type)(sqlite3_value*);
|
||||||
|
const unsigned char * (*value_text)(sqlite3_value*);
|
||||||
|
const void * (*value_text16)(sqlite3_value*);
|
||||||
|
const void * (*value_text16be)(sqlite3_value*);
|
||||||
|
const void * (*value_text16le)(sqlite3_value*);
|
||||||
|
int (*value_type)(sqlite3_value*);
|
||||||
|
char *(*vmprintf)(const char*,va_list);
|
||||||
|
/* Added ??? */
|
||||||
|
int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
|
||||||
|
/* Added by 3.3.13 */
|
||||||
|
int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
int (*clear_bindings)(sqlite3_stmt*);
|
||||||
|
/* Added by 3.4.1 */
|
||||||
|
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
|
||||||
|
void (*xDestroy)(void *));
|
||||||
|
/* Added by 3.5.0 */
|
||||||
|
int (*bind_zeroblob)(sqlite3_stmt*,int,int);
|
||||||
|
int (*blob_bytes)(sqlite3_blob*);
|
||||||
|
int (*blob_close)(sqlite3_blob*);
|
||||||
|
int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
|
||||||
|
int,sqlite3_blob**);
|
||||||
|
int (*blob_read)(sqlite3_blob*,void*,int,int);
|
||||||
|
int (*blob_write)(sqlite3_blob*,const void*,int,int);
|
||||||
|
int (*create_collation_v2)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*),
|
||||||
|
void(*)(void*));
|
||||||
|
int (*file_control)(sqlite3*,const char*,int,void*);
|
||||||
|
sqlite3_int64 (*memory_highwater)(int);
|
||||||
|
sqlite3_int64 (*memory_used)(void);
|
||||||
|
sqlite3_mutex *(*mutex_alloc)(int);
|
||||||
|
void (*mutex_enter)(sqlite3_mutex*);
|
||||||
|
void (*mutex_free)(sqlite3_mutex*);
|
||||||
|
void (*mutex_leave)(sqlite3_mutex*);
|
||||||
|
int (*mutex_try)(sqlite3_mutex*);
|
||||||
|
int (*open_v2)(const char*,sqlite3**,int,const char*);
|
||||||
|
int (*release_memory)(int);
|
||||||
|
void (*result_error_nomem)(sqlite3_context*);
|
||||||
|
void (*result_error_toobig)(sqlite3_context*);
|
||||||
|
int (*sleep)(int);
|
||||||
|
void (*soft_heap_limit)(int);
|
||||||
|
sqlite3_vfs *(*vfs_find)(const char*);
|
||||||
|
int (*vfs_register)(sqlite3_vfs*,int);
|
||||||
|
int (*vfs_unregister)(sqlite3_vfs*);
|
||||||
|
int (*xthreadsafe)(void);
|
||||||
|
void (*result_zeroblob)(sqlite3_context*,int);
|
||||||
|
void (*result_error_code)(sqlite3_context*,int);
|
||||||
|
int (*test_control)(int, ...);
|
||||||
|
void (*randomness)(int,void*);
|
||||||
|
sqlite3 *(*context_db_handle)(sqlite3_context*);
|
||||||
|
int (*extended_result_codes)(sqlite3*,int);
|
||||||
|
int (*limit)(sqlite3*,int,int);
|
||||||
|
sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
|
||||||
|
const char *(*sql)(sqlite3_stmt*);
|
||||||
|
int (*status)(int,int*,int*,int);
|
||||||
|
int (*backup_finish)(sqlite3_backup*);
|
||||||
|
sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
|
||||||
|
int (*backup_pagecount)(sqlite3_backup*);
|
||||||
|
int (*backup_remaining)(sqlite3_backup*);
|
||||||
|
int (*backup_step)(sqlite3_backup*,int);
|
||||||
|
const char *(*compileoption_get)(int);
|
||||||
|
int (*compileoption_used)(const char*);
|
||||||
|
int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*),
|
||||||
|
void(*xDestroy)(void*));
|
||||||
|
int (*db_config)(sqlite3*,int,...);
|
||||||
|
sqlite3_mutex *(*db_mutex)(sqlite3*);
|
||||||
|
int (*db_status)(sqlite3*,int,int*,int*,int);
|
||||||
|
int (*extended_errcode)(sqlite3*);
|
||||||
|
void (*log)(int,const char*,...);
|
||||||
|
sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
|
||||||
|
const char *(*sourceid)(void);
|
||||||
|
int (*stmt_status)(sqlite3_stmt*,int,int);
|
||||||
|
int (*strnicmp)(const char*,const char*,int);
|
||||||
|
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
|
||||||
|
int (*wal_autocheckpoint)(sqlite3*,int);
|
||||||
|
int (*wal_checkpoint)(sqlite3*,const char*);
|
||||||
|
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
|
||||||
|
int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
|
||||||
|
int (*vtab_config)(sqlite3*,int op,...);
|
||||||
|
int (*vtab_on_conflict)(sqlite3*);
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
int (*close_v2)(sqlite3*);
|
||||||
|
const char *(*db_filename)(sqlite3*,const char*);
|
||||||
|
int (*db_readonly)(sqlite3*,const char*);
|
||||||
|
int (*db_release_memory)(sqlite3*);
|
||||||
|
const char *(*errstr)(int);
|
||||||
|
int (*stmt_busy)(sqlite3_stmt*);
|
||||||
|
int (*stmt_readonly)(sqlite3_stmt*);
|
||||||
|
int (*stricmp)(const char*,const char*);
|
||||||
|
int (*uri_boolean)(const char*,const char*,int);
|
||||||
|
sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
|
||||||
|
const char *(*uri_parameter)(const char*,const char*);
|
||||||
|
char *(*xvsnprintf)(int,char*,const char*,va_list);
|
||||||
|
int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
int (*auto_extension)(void(*)(void));
|
||||||
|
int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*),unsigned char);
|
||||||
|
int (*cancel_auto_extension)(void(*)(void));
|
||||||
|
int (*load_extension)(sqlite3*,const char*,const char*,char**);
|
||||||
|
void *(*malloc64)(sqlite3_uint64);
|
||||||
|
sqlite3_uint64 (*msize)(void*);
|
||||||
|
void *(*realloc64)(void*,sqlite3_uint64);
|
||||||
|
void (*reset_auto_extension)(void);
|
||||||
|
void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*), unsigned char);
|
||||||
|
int (*strglob)(const char*,const char*);
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
sqlite3_value *(*value_dup)(const sqlite3_value*);
|
||||||
|
void (*value_free)(sqlite3_value*);
|
||||||
|
int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64);
|
||||||
|
int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64);
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
unsigned int (*value_subtype)(sqlite3_value*);
|
||||||
|
void (*result_subtype)(sqlite3_context*,unsigned int);
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int);
|
||||||
|
int (*strlike)(const char*,const char*,unsigned int);
|
||||||
|
int (*db_cacheflush)(sqlite3*);
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
int (*system_errno)(sqlite3*);
|
||||||
|
/* Version 3.14.0 and later */
|
||||||
|
int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*);
|
||||||
|
char *(*expanded_sql)(sqlite3_stmt*);
|
||||||
|
/* Version 3.18.0 and later */
|
||||||
|
void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64);
|
||||||
|
/* Version 3.20.0 and later */
|
||||||
|
int (*prepare_v3)(sqlite3*,const char*,int,unsigned int,
|
||||||
|
sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int,
|
||||||
|
sqlite3_stmt**,const void**);
|
||||||
|
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
|
||||||
|
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
|
||||||
|
void *(*value_pointer)(sqlite3_value*,const char*);
|
||||||
|
int (*vtab_nochange)(sqlite3_context*);
|
||||||
|
int (*value_nochange)(sqlite3_value*);
|
||||||
|
const char *(*vtab_collation)(sqlite3_index_info*,int);
|
||||||
|
/* Version 3.24.0 and later */
|
||||||
|
int (*keyword_count)(void);
|
||||||
|
int (*keyword_name)(int,const char**,int*);
|
||||||
|
int (*keyword_check)(const char*,int);
|
||||||
|
sqlite3_str *(*str_new)(sqlite3*);
|
||||||
|
char *(*str_finish)(sqlite3_str*);
|
||||||
|
void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
|
||||||
|
void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
|
||||||
|
void (*str_append)(sqlite3_str*, const char *zIn, int N);
|
||||||
|
void (*str_appendall)(sqlite3_str*, const char *zIn);
|
||||||
|
void (*str_appendchar)(sqlite3_str*, int N, char C);
|
||||||
|
void (*str_reset)(sqlite3_str*);
|
||||||
|
int (*str_errcode)(sqlite3_str*);
|
||||||
|
int (*str_length)(sqlite3_str*);
|
||||||
|
char *(*str_value)(sqlite3_str*);
|
||||||
|
/* Version 3.25.0 and later */
|
||||||
|
int (*create_window_function)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*),
|
||||||
|
void (*xValue)(sqlite3_context*),
|
||||||
|
void (*xInv)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void(*xDestroy)(void*));
|
||||||
|
/* Version 3.26.0 and later */
|
||||||
|
const char *(*normalized_sql)(sqlite3_stmt*);
|
||||||
|
/* Version 3.28.0 and later */
|
||||||
|
int (*stmt_isexplain)(sqlite3_stmt*);
|
||||||
|
int (*value_frombind)(sqlite3_value*);
|
||||||
|
/* Version 3.30.0 and later */
|
||||||
|
int (*drop_modules)(sqlite3*,const char**);
|
||||||
|
/* Version 3.31.0 and later */
|
||||||
|
sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64);
|
||||||
|
const char *(*uri_key)(const char*,int);
|
||||||
|
const char *(*filename_database)(const char*);
|
||||||
|
const char *(*filename_journal)(const char*);
|
||||||
|
const char *(*filename_wal)(const char*);
|
||||||
|
/* Version 3.32.0 and later */
|
||||||
|
const char *(*create_filename)(const char*,const char*,const char*,
|
||||||
|
int,const char**);
|
||||||
|
void (*free_filename)(const char*);
|
||||||
|
sqlite3_file *(*database_file_object)(const char*);
|
||||||
|
/* Version 3.34.0 and later */
|
||||||
|
int (*txn_state)(sqlite3*,const char*);
|
||||||
|
/* Version 3.36.1 and later */
|
||||||
|
sqlite3_int64 (*changes64)(sqlite3*);
|
||||||
|
sqlite3_int64 (*total_changes64)(sqlite3*);
|
||||||
|
/* Version 3.37.0 and later */
|
||||||
|
int (*autovacuum_pages)(sqlite3*,
|
||||||
|
unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
|
||||||
|
void*, void(*)(void*));
|
||||||
|
/* Version 3.38.0 and later */
|
||||||
|
int (*error_offset)(sqlite3*);
|
||||||
|
int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**);
|
||||||
|
int (*vtab_distinct)(sqlite3_index_info*);
|
||||||
|
int (*vtab_in)(sqlite3_index_info*,int,int);
|
||||||
|
int (*vtab_in_first)(sqlite3_value*,sqlite3_value**);
|
||||||
|
int (*vtab_in_next)(sqlite3_value*,sqlite3_value**);
|
||||||
|
/* Version 3.39.0 and later */
|
||||||
|
int (*deserialize)(sqlite3*,const char*,unsigned char*,
|
||||||
|
sqlite3_int64,sqlite3_int64,unsigned);
|
||||||
|
unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*,
|
||||||
|
unsigned int);
|
||||||
|
const char *(*db_name)(sqlite3*,int);
|
||||||
|
/* Version 3.40.0 and later */
|
||||||
|
int (*value_encoding)(sqlite3_value*);
|
||||||
|
/* Version 3.41.0 and later */
|
||||||
|
int (*is_interrupted)(sqlite3*);
|
||||||
|
/* Version 3.43.0 and later */
|
||||||
|
int (*stmt_explain)(sqlite3_stmt*,int);
|
||||||
|
/* Version 3.44.0 and later */
|
||||||
|
void *(*get_clientdata)(sqlite3*,const char*);
|
||||||
|
int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*));
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This is the function signature used for all extension entry points. It
|
||||||
|
** is also defined in the file "loadext.c".
|
||||||
|
*/
|
||||||
|
typedef int (*sqlite3_loadext_entry)(
|
||||||
|
sqlite3 *db, /* Handle to the database. */
|
||||||
|
char **pzErrMsg, /* Used to set error string on failure. */
|
||||||
|
const sqlite3_api_routines *pThunk /* Extension API function pointers. */
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following macros redefine the API routines so that they are
|
||||||
|
** redirected through the global sqlite3_api structure.
|
||||||
|
**
|
||||||
|
** This header file is also used by the loadext.c source file
|
||||||
|
** (part of the main SQLite library - not an extension) so that
|
||||||
|
** it can get access to the sqlite3_api_routines structure
|
||||||
|
** definition. But the main library does not want to redefine
|
||||||
|
** the API. So the redefinition macros are only valid if the
|
||||||
|
** SQLITE_CORE macros is undefined.
|
||||||
|
*/
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
|
||||||
|
#endif
|
||||||
|
#define sqlite3_bind_blob sqlite3_api->bind_blob
|
||||||
|
#define sqlite3_bind_double sqlite3_api->bind_double
|
||||||
|
#define sqlite3_bind_int sqlite3_api->bind_int
|
||||||
|
#define sqlite3_bind_int64 sqlite3_api->bind_int64
|
||||||
|
#define sqlite3_bind_null sqlite3_api->bind_null
|
||||||
|
#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
|
||||||
|
#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
|
||||||
|
#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
|
||||||
|
#define sqlite3_bind_text sqlite3_api->bind_text
|
||||||
|
#define sqlite3_bind_text16 sqlite3_api->bind_text16
|
||||||
|
#define sqlite3_bind_value sqlite3_api->bind_value
|
||||||
|
#define sqlite3_busy_handler sqlite3_api->busy_handler
|
||||||
|
#define sqlite3_busy_timeout sqlite3_api->busy_timeout
|
||||||
|
#define sqlite3_changes sqlite3_api->changes
|
||||||
|
#define sqlite3_close sqlite3_api->close
|
||||||
|
#define sqlite3_collation_needed sqlite3_api->collation_needed
|
||||||
|
#define sqlite3_collation_needed16 sqlite3_api->collation_needed16
|
||||||
|
#define sqlite3_column_blob sqlite3_api->column_blob
|
||||||
|
#define sqlite3_column_bytes sqlite3_api->column_bytes
|
||||||
|
#define sqlite3_column_bytes16 sqlite3_api->column_bytes16
|
||||||
|
#define sqlite3_column_count sqlite3_api->column_count
|
||||||
|
#define sqlite3_column_database_name sqlite3_api->column_database_name
|
||||||
|
#define sqlite3_column_database_name16 sqlite3_api->column_database_name16
|
||||||
|
#define sqlite3_column_decltype sqlite3_api->column_decltype
|
||||||
|
#define sqlite3_column_decltype16 sqlite3_api->column_decltype16
|
||||||
|
#define sqlite3_column_double sqlite3_api->column_double
|
||||||
|
#define sqlite3_column_int sqlite3_api->column_int
|
||||||
|
#define sqlite3_column_int64 sqlite3_api->column_int64
|
||||||
|
#define sqlite3_column_name sqlite3_api->column_name
|
||||||
|
#define sqlite3_column_name16 sqlite3_api->column_name16
|
||||||
|
#define sqlite3_column_origin_name sqlite3_api->column_origin_name
|
||||||
|
#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
|
||||||
|
#define sqlite3_column_table_name sqlite3_api->column_table_name
|
||||||
|
#define sqlite3_column_table_name16 sqlite3_api->column_table_name16
|
||||||
|
#define sqlite3_column_text sqlite3_api->column_text
|
||||||
|
#define sqlite3_column_text16 sqlite3_api->column_text16
|
||||||
|
#define sqlite3_column_type sqlite3_api->column_type
|
||||||
|
#define sqlite3_column_value sqlite3_api->column_value
|
||||||
|
#define sqlite3_commit_hook sqlite3_api->commit_hook
|
||||||
|
#define sqlite3_complete sqlite3_api->complete
|
||||||
|
#define sqlite3_complete16 sqlite3_api->complete16
|
||||||
|
#define sqlite3_create_collation sqlite3_api->create_collation
|
||||||
|
#define sqlite3_create_collation16 sqlite3_api->create_collation16
|
||||||
|
#define sqlite3_create_function sqlite3_api->create_function
|
||||||
|
#define sqlite3_create_function16 sqlite3_api->create_function16
|
||||||
|
#define sqlite3_create_module sqlite3_api->create_module
|
||||||
|
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2
|
||||||
|
#define sqlite3_data_count sqlite3_api->data_count
|
||||||
|
#define sqlite3_db_handle sqlite3_api->db_handle
|
||||||
|
#define sqlite3_declare_vtab sqlite3_api->declare_vtab
|
||||||
|
#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
|
||||||
|
#define sqlite3_errcode sqlite3_api->errcode
|
||||||
|
#define sqlite3_errmsg sqlite3_api->errmsg
|
||||||
|
#define sqlite3_errmsg16 sqlite3_api->errmsg16
|
||||||
|
#define sqlite3_exec sqlite3_api->exec
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_expired sqlite3_api->expired
|
||||||
|
#endif
|
||||||
|
#define sqlite3_finalize sqlite3_api->finalize
|
||||||
|
#define sqlite3_free sqlite3_api->free
|
||||||
|
#define sqlite3_free_table sqlite3_api->free_table
|
||||||
|
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
|
||||||
|
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
|
||||||
|
#define sqlite3_get_table sqlite3_api->get_table
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_global_recover sqlite3_api->global_recover
|
||||||
|
#endif
|
||||||
|
#define sqlite3_interrupt sqlite3_api->interruptx
|
||||||
|
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
|
||||||
|
#define sqlite3_libversion sqlite3_api->libversion
|
||||||
|
#define sqlite3_libversion_number sqlite3_api->libversion_number
|
||||||
|
#define sqlite3_malloc sqlite3_api->malloc
|
||||||
|
#define sqlite3_mprintf sqlite3_api->mprintf
|
||||||
|
#define sqlite3_open sqlite3_api->open
|
||||||
|
#define sqlite3_open16 sqlite3_api->open16
|
||||||
|
#define sqlite3_prepare sqlite3_api->prepare
|
||||||
|
#define sqlite3_prepare16 sqlite3_api->prepare16
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_profile sqlite3_api->profile
|
||||||
|
#define sqlite3_progress_handler sqlite3_api->progress_handler
|
||||||
|
#define sqlite3_realloc sqlite3_api->realloc
|
||||||
|
#define sqlite3_reset sqlite3_api->reset
|
||||||
|
#define sqlite3_result_blob sqlite3_api->result_blob
|
||||||
|
#define sqlite3_result_double sqlite3_api->result_double
|
||||||
|
#define sqlite3_result_error sqlite3_api->result_error
|
||||||
|
#define sqlite3_result_error16 sqlite3_api->result_error16
|
||||||
|
#define sqlite3_result_int sqlite3_api->result_int
|
||||||
|
#define sqlite3_result_int64 sqlite3_api->result_int64
|
||||||
|
#define sqlite3_result_null sqlite3_api->result_null
|
||||||
|
#define sqlite3_result_text sqlite3_api->result_text
|
||||||
|
#define sqlite3_result_text16 sqlite3_api->result_text16
|
||||||
|
#define sqlite3_result_text16be sqlite3_api->result_text16be
|
||||||
|
#define sqlite3_result_text16le sqlite3_api->result_text16le
|
||||||
|
#define sqlite3_result_value sqlite3_api->result_value
|
||||||
|
#define sqlite3_rollback_hook sqlite3_api->rollback_hook
|
||||||
|
#define sqlite3_set_authorizer sqlite3_api->set_authorizer
|
||||||
|
#define sqlite3_set_auxdata sqlite3_api->set_auxdata
|
||||||
|
#define sqlite3_snprintf sqlite3_api->xsnprintf
|
||||||
|
#define sqlite3_step sqlite3_api->step
|
||||||
|
#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
|
||||||
|
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
|
||||||
|
#define sqlite3_total_changes sqlite3_api->total_changes
|
||||||
|
#define sqlite3_trace sqlite3_api->trace
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
|
||||||
|
#endif
|
||||||
|
#define sqlite3_update_hook sqlite3_api->update_hook
|
||||||
|
#define sqlite3_user_data sqlite3_api->user_data
|
||||||
|
#define sqlite3_value_blob sqlite3_api->value_blob
|
||||||
|
#define sqlite3_value_bytes sqlite3_api->value_bytes
|
||||||
|
#define sqlite3_value_bytes16 sqlite3_api->value_bytes16
|
||||||
|
#define sqlite3_value_double sqlite3_api->value_double
|
||||||
|
#define sqlite3_value_int sqlite3_api->value_int
|
||||||
|
#define sqlite3_value_int64 sqlite3_api->value_int64
|
||||||
|
#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
|
||||||
|
#define sqlite3_value_text sqlite3_api->value_text
|
||||||
|
#define sqlite3_value_text16 sqlite3_api->value_text16
|
||||||
|
#define sqlite3_value_text16be sqlite3_api->value_text16be
|
||||||
|
#define sqlite3_value_text16le sqlite3_api->value_text16le
|
||||||
|
#define sqlite3_value_type sqlite3_api->value_type
|
||||||
|
#define sqlite3_vmprintf sqlite3_api->vmprintf
|
||||||
|
#define sqlite3_vsnprintf sqlite3_api->xvsnprintf
|
||||||
|
#define sqlite3_overload_function sqlite3_api->overload_function
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_clear_bindings sqlite3_api->clear_bindings
|
||||||
|
#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
|
||||||
|
#define sqlite3_blob_bytes sqlite3_api->blob_bytes
|
||||||
|
#define sqlite3_blob_close sqlite3_api->blob_close
|
||||||
|
#define sqlite3_blob_open sqlite3_api->blob_open
|
||||||
|
#define sqlite3_blob_read sqlite3_api->blob_read
|
||||||
|
#define sqlite3_blob_write sqlite3_api->blob_write
|
||||||
|
#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
|
||||||
|
#define sqlite3_file_control sqlite3_api->file_control
|
||||||
|
#define sqlite3_memory_highwater sqlite3_api->memory_highwater
|
||||||
|
#define sqlite3_memory_used sqlite3_api->memory_used
|
||||||
|
#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
|
||||||
|
#define sqlite3_mutex_enter sqlite3_api->mutex_enter
|
||||||
|
#define sqlite3_mutex_free sqlite3_api->mutex_free
|
||||||
|
#define sqlite3_mutex_leave sqlite3_api->mutex_leave
|
||||||
|
#define sqlite3_mutex_try sqlite3_api->mutex_try
|
||||||
|
#define sqlite3_open_v2 sqlite3_api->open_v2
|
||||||
|
#define sqlite3_release_memory sqlite3_api->release_memory
|
||||||
|
#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
|
||||||
|
#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
|
||||||
|
#define sqlite3_sleep sqlite3_api->sleep
|
||||||
|
#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
|
||||||
|
#define sqlite3_vfs_find sqlite3_api->vfs_find
|
||||||
|
#define sqlite3_vfs_register sqlite3_api->vfs_register
|
||||||
|
#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
|
||||||
|
#define sqlite3_threadsafe sqlite3_api->xthreadsafe
|
||||||
|
#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
|
||||||
|
#define sqlite3_result_error_code sqlite3_api->result_error_code
|
||||||
|
#define sqlite3_test_control sqlite3_api->test_control
|
||||||
|
#define sqlite3_randomness sqlite3_api->randomness
|
||||||
|
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
|
||||||
|
#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
|
||||||
|
#define sqlite3_limit sqlite3_api->limit
|
||||||
|
#define sqlite3_next_stmt sqlite3_api->next_stmt
|
||||||
|
#define sqlite3_sql sqlite3_api->sql
|
||||||
|
#define sqlite3_status sqlite3_api->status
|
||||||
|
#define sqlite3_backup_finish sqlite3_api->backup_finish
|
||||||
|
#define sqlite3_backup_init sqlite3_api->backup_init
|
||||||
|
#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
|
||||||
|
#define sqlite3_backup_remaining sqlite3_api->backup_remaining
|
||||||
|
#define sqlite3_backup_step sqlite3_api->backup_step
|
||||||
|
#define sqlite3_compileoption_get sqlite3_api->compileoption_get
|
||||||
|
#define sqlite3_compileoption_used sqlite3_api->compileoption_used
|
||||||
|
#define sqlite3_create_function_v2 sqlite3_api->create_function_v2
|
||||||
|
#define sqlite3_db_config sqlite3_api->db_config
|
||||||
|
#define sqlite3_db_mutex sqlite3_api->db_mutex
|
||||||
|
#define sqlite3_db_status sqlite3_api->db_status
|
||||||
|
#define sqlite3_extended_errcode sqlite3_api->extended_errcode
|
||||||
|
#define sqlite3_log sqlite3_api->log
|
||||||
|
#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
|
||||||
|
#define sqlite3_sourceid sqlite3_api->sourceid
|
||||||
|
#define sqlite3_stmt_status sqlite3_api->stmt_status
|
||||||
|
#define sqlite3_strnicmp sqlite3_api->strnicmp
|
||||||
|
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
|
||||||
|
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
|
||||||
|
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
|
||||||
|
#define sqlite3_wal_hook sqlite3_api->wal_hook
|
||||||
|
#define sqlite3_blob_reopen sqlite3_api->blob_reopen
|
||||||
|
#define sqlite3_vtab_config sqlite3_api->vtab_config
|
||||||
|
#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
#define sqlite3_close_v2 sqlite3_api->close_v2
|
||||||
|
#define sqlite3_db_filename sqlite3_api->db_filename
|
||||||
|
#define sqlite3_db_readonly sqlite3_api->db_readonly
|
||||||
|
#define sqlite3_db_release_memory sqlite3_api->db_release_memory
|
||||||
|
#define sqlite3_errstr sqlite3_api->errstr
|
||||||
|
#define sqlite3_stmt_busy sqlite3_api->stmt_busy
|
||||||
|
#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly
|
||||||
|
#define sqlite3_stricmp sqlite3_api->stricmp
|
||||||
|
#define sqlite3_uri_boolean sqlite3_api->uri_boolean
|
||||||
|
#define sqlite3_uri_int64 sqlite3_api->uri_int64
|
||||||
|
#define sqlite3_uri_parameter sqlite3_api->uri_parameter
|
||||||
|
#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf
|
||||||
|
#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
#define sqlite3_auto_extension sqlite3_api->auto_extension
|
||||||
|
#define sqlite3_bind_blob64 sqlite3_api->bind_blob64
|
||||||
|
#define sqlite3_bind_text64 sqlite3_api->bind_text64
|
||||||
|
#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension
|
||||||
|
#define sqlite3_load_extension sqlite3_api->load_extension
|
||||||
|
#define sqlite3_malloc64 sqlite3_api->malloc64
|
||||||
|
#define sqlite3_msize sqlite3_api->msize
|
||||||
|
#define sqlite3_realloc64 sqlite3_api->realloc64
|
||||||
|
#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension
|
||||||
|
#define sqlite3_result_blob64 sqlite3_api->result_blob64
|
||||||
|
#define sqlite3_result_text64 sqlite3_api->result_text64
|
||||||
|
#define sqlite3_strglob sqlite3_api->strglob
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
#define sqlite3_value_dup sqlite3_api->value_dup
|
||||||
|
#define sqlite3_value_free sqlite3_api->value_free
|
||||||
|
#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64
|
||||||
|
#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
#define sqlite3_value_subtype sqlite3_api->value_subtype
|
||||||
|
#define sqlite3_result_subtype sqlite3_api->result_subtype
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
#define sqlite3_status64 sqlite3_api->status64
|
||||||
|
#define sqlite3_strlike sqlite3_api->strlike
|
||||||
|
#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
#define sqlite3_system_errno sqlite3_api->system_errno
|
||||||
|
/* Version 3.14.0 and later */
|
||||||
|
#define sqlite3_trace_v2 sqlite3_api->trace_v2
|
||||||
|
#define sqlite3_expanded_sql sqlite3_api->expanded_sql
|
||||||
|
/* Version 3.18.0 and later */
|
||||||
|
#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid
|
||||||
|
/* Version 3.20.0 and later */
|
||||||
|
#define sqlite3_prepare_v3 sqlite3_api->prepare_v3
|
||||||
|
#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3
|
||||||
|
#define sqlite3_bind_pointer sqlite3_api->bind_pointer
|
||||||
|
#define sqlite3_result_pointer sqlite3_api->result_pointer
|
||||||
|
#define sqlite3_value_pointer sqlite3_api->value_pointer
|
||||||
|
/* Version 3.22.0 and later */
|
||||||
|
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
|
||||||
|
#define sqlite3_value_nochange sqlite3_api->value_nochange
|
||||||
|
#define sqlite3_vtab_collation sqlite3_api->vtab_collation
|
||||||
|
/* Version 3.24.0 and later */
|
||||||
|
#define sqlite3_keyword_count sqlite3_api->keyword_count
|
||||||
|
#define sqlite3_keyword_name sqlite3_api->keyword_name
|
||||||
|
#define sqlite3_keyword_check sqlite3_api->keyword_check
|
||||||
|
#define sqlite3_str_new sqlite3_api->str_new
|
||||||
|
#define sqlite3_str_finish sqlite3_api->str_finish
|
||||||
|
#define sqlite3_str_appendf sqlite3_api->str_appendf
|
||||||
|
#define sqlite3_str_vappendf sqlite3_api->str_vappendf
|
||||||
|
#define sqlite3_str_append sqlite3_api->str_append
|
||||||
|
#define sqlite3_str_appendall sqlite3_api->str_appendall
|
||||||
|
#define sqlite3_str_appendchar sqlite3_api->str_appendchar
|
||||||
|
#define sqlite3_str_reset sqlite3_api->str_reset
|
||||||
|
#define sqlite3_str_errcode sqlite3_api->str_errcode
|
||||||
|
#define sqlite3_str_length sqlite3_api->str_length
|
||||||
|
#define sqlite3_str_value sqlite3_api->str_value
|
||||||
|
/* Version 3.25.0 and later */
|
||||||
|
#define sqlite3_create_window_function sqlite3_api->create_window_function
|
||||||
|
/* Version 3.26.0 and later */
|
||||||
|
#define sqlite3_normalized_sql sqlite3_api->normalized_sql
|
||||||
|
/* Version 3.28.0 and later */
|
||||||
|
#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain
|
||||||
|
#define sqlite3_value_frombind sqlite3_api->value_frombind
|
||||||
|
/* Version 3.30.0 and later */
|
||||||
|
#define sqlite3_drop_modules sqlite3_api->drop_modules
|
||||||
|
/* Version 3.31.0 and later */
|
||||||
|
#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64
|
||||||
|
#define sqlite3_uri_key sqlite3_api->uri_key
|
||||||
|
#define sqlite3_filename_database sqlite3_api->filename_database
|
||||||
|
#define sqlite3_filename_journal sqlite3_api->filename_journal
|
||||||
|
#define sqlite3_filename_wal sqlite3_api->filename_wal
|
||||||
|
/* Version 3.32.0 and later */
|
||||||
|
#define sqlite3_create_filename sqlite3_api->create_filename
|
||||||
|
#define sqlite3_free_filename sqlite3_api->free_filename
|
||||||
|
#define sqlite3_database_file_object sqlite3_api->database_file_object
|
||||||
|
/* Version 3.34.0 and later */
|
||||||
|
#define sqlite3_txn_state sqlite3_api->txn_state
|
||||||
|
/* Version 3.36.1 and later */
|
||||||
|
#define sqlite3_changes64 sqlite3_api->changes64
|
||||||
|
#define sqlite3_total_changes64 sqlite3_api->total_changes64
|
||||||
|
/* Version 3.37.0 and later */
|
||||||
|
#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages
|
||||||
|
/* Version 3.38.0 and later */
|
||||||
|
#define sqlite3_error_offset sqlite3_api->error_offset
|
||||||
|
#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value
|
||||||
|
#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct
|
||||||
|
#define sqlite3_vtab_in sqlite3_api->vtab_in
|
||||||
|
#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first
|
||||||
|
#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next
|
||||||
|
/* Version 3.39.0 and later */
|
||||||
|
#ifndef SQLITE_OMIT_DESERIALIZE
|
||||||
|
#define sqlite3_deserialize sqlite3_api->deserialize
|
||||||
|
#define sqlite3_serialize sqlite3_api->serialize
|
||||||
|
#endif
|
||||||
|
#define sqlite3_db_name sqlite3_api->db_name
|
||||||
|
/* Version 3.40.0 and later */
|
||||||
|
#define sqlite3_value_encoding sqlite3_api->value_encoding
|
||||||
|
/* Version 3.41.0 and later */
|
||||||
|
#define sqlite3_is_interrupted sqlite3_api->is_interrupted
|
||||||
|
/* Version 3.43.0 and later */
|
||||||
|
#define sqlite3_stmt_explain sqlite3_api->stmt_explain
|
||||||
|
/* Version 3.44.0 and later */
|
||||||
|
#define sqlite3_get_clientdata sqlite3_api->get_clientdata
|
||||||
|
#define sqlite3_set_clientdata sqlite3_api->set_clientdata
|
||||||
|
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
||||||
|
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
/* This case when the file really is being compiled as a loadable
|
||||||
|
** extension */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0;
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v;
|
||||||
|
# define SQLITE_EXTENSION_INIT3 \
|
||||||
|
extern const sqlite3_api_routines *sqlite3_api;
|
||||||
|
#else
|
||||||
|
/* This case when the file is being statically linked into the
|
||||||
|
** application */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 /*no-op*/
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */
|
||||||
|
# define SQLITE_EXTENSION_INIT3 /*no-op*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* SQLITE3EXT_H */
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#include <sqlite3ext.h>
|
||||||
|
SQLITE_EXTENSION_INIT1
|
||||||
|
|
||||||
|
/*
|
||||||
|
This SQLite3 extension is used only for testing purposes (npm test).
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void TestExtensionFunction(sqlite3_context* pCtx, int nVal, sqlite3_value** _) {
|
||||||
|
sqlite3_result_double(pCtx, (double)nVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
__declspec(dllexport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int sqlite3_extension_init(sqlite3* db, char** pzErrMsg, const sqlite3_api_routines* pApi) {
|
||||||
|
SQLITE_EXTENSION_INIT2(pApi)
|
||||||
|
if (pzErrMsg != 0) *pzErrMsg = 0;
|
||||||
|
sqlite3_create_function(db, "testExtensionFunction", -1, SQLITE_UTF8, 0, TestExtensionFunction, 0, 0);
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
+90
@@ -0,0 +1,90 @@
|
|||||||
|
'use strict';
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const util = require('./util');
|
||||||
|
const SqliteError = require('./sqlite-error');
|
||||||
|
|
||||||
|
let DEFAULT_ADDON;
|
||||||
|
|
||||||
|
function Database(filenameGiven, options) {
|
||||||
|
if (new.target == null) {
|
||||||
|
return new Database(filenameGiven, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply defaults
|
||||||
|
let buffer;
|
||||||
|
if (Buffer.isBuffer(filenameGiven)) {
|
||||||
|
buffer = filenameGiven;
|
||||||
|
filenameGiven = ':memory:';
|
||||||
|
}
|
||||||
|
if (filenameGiven == null) filenameGiven = '';
|
||||||
|
if (options == null) options = {};
|
||||||
|
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof filenameGiven !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');
|
||||||
|
if ('readOnly' in options) throw new TypeError('Misspelled option "readOnly" should be "readonly"');
|
||||||
|
if ('memory' in options) throw new TypeError('Option "memory" was removed in v7.0.0 (use ":memory:" filename instead)');
|
||||||
|
|
||||||
|
// Interpret options
|
||||||
|
const filename = filenameGiven.trim();
|
||||||
|
const anonymous = filename === '' || filename === ':memory:';
|
||||||
|
const readonly = util.getBooleanOption(options, 'readonly');
|
||||||
|
const fileMustExist = util.getBooleanOption(options, 'fileMustExist');
|
||||||
|
const timeout = 'timeout' in options ? options.timeout : 5000;
|
||||||
|
const verbose = 'verbose' in options ? options.verbose : null;
|
||||||
|
const nativeBinding = 'nativeBinding' in options ? options.nativeBinding : null;
|
||||||
|
|
||||||
|
// Validate interpreted options
|
||||||
|
if (readonly && anonymous && !buffer) throw new TypeError('In-memory/temporary databases cannot be readonly');
|
||||||
|
if (!Number.isInteger(timeout) || timeout < 0) throw new TypeError('Expected the "timeout" option to be a positive integer');
|
||||||
|
if (timeout > 0x7fffffff) throw new RangeError('Option "timeout" cannot be greater than 2147483647');
|
||||||
|
if (verbose != null && typeof verbose !== 'function') throw new TypeError('Expected the "verbose" option to be a function');
|
||||||
|
if (nativeBinding != null && typeof nativeBinding !== 'string' && typeof nativeBinding !== 'object') throw new TypeError('Expected the "nativeBinding" option to be a string or addon object');
|
||||||
|
|
||||||
|
// Load the native addon
|
||||||
|
let addon;
|
||||||
|
if (nativeBinding == null) {
|
||||||
|
addon = DEFAULT_ADDON || (DEFAULT_ADDON = require('bindings')('better_sqlite3.node'));
|
||||||
|
} else if (typeof nativeBinding === 'string') {
|
||||||
|
// See <https://webpack.js.org/api/module-variables/#__non_webpack_require__-webpack-specific>
|
||||||
|
const requireFunc = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;
|
||||||
|
addon = requireFunc(path.resolve(nativeBinding).replace(/(\.node)?$/, '.node'));
|
||||||
|
} else {
|
||||||
|
// See <https://github.com/WiseLibs/better-sqlite3/issues/972>
|
||||||
|
addon = nativeBinding;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!addon.isInitialized) {
|
||||||
|
addon.setErrorConstructor(SqliteError);
|
||||||
|
addon.isInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the specified directory exists
|
||||||
|
if (!anonymous && !fs.existsSync(path.dirname(filename))) {
|
||||||
|
throw new TypeError('Cannot open database because the directory does not exist');
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperties(this, {
|
||||||
|
[util.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly, fileMustExist, timeout, verbose || null, buffer || null) },
|
||||||
|
...wrappers.getters,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const wrappers = require('./methods/wrappers');
|
||||||
|
Database.prototype.prepare = wrappers.prepare;
|
||||||
|
Database.prototype.transaction = require('./methods/transaction');
|
||||||
|
Database.prototype.pragma = require('./methods/pragma');
|
||||||
|
Database.prototype.backup = require('./methods/backup');
|
||||||
|
Database.prototype.serialize = require('./methods/serialize');
|
||||||
|
Database.prototype.function = require('./methods/function');
|
||||||
|
Database.prototype.aggregate = require('./methods/aggregate');
|
||||||
|
Database.prototype.table = require('./methods/table');
|
||||||
|
Database.prototype.loadExtension = wrappers.loadExtension;
|
||||||
|
Database.prototype.exec = wrappers.exec;
|
||||||
|
Database.prototype.close = wrappers.close;
|
||||||
|
Database.prototype.defaultSafeIntegers = wrappers.defaultSafeIntegers;
|
||||||
|
Database.prototype.unsafeMode = wrappers.unsafeMode;
|
||||||
|
Database.prototype[util.inspect] = require('./methods/inspect');
|
||||||
|
|
||||||
|
module.exports = Database;
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
'use strict';
|
||||||
|
module.exports = require('./database');
|
||||||
|
module.exports.SqliteError = require('./sqlite-error');
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
'use strict';
|
||||||
|
const { getBooleanOption, cppdb } = require('../util');
|
||||||
|
|
||||||
|
module.exports = function defineAggregate(name, options) {
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (typeof options !== 'object' || options === null) throw new TypeError('Expected second argument to be an options object');
|
||||||
|
if (!name) throw new TypeError('User-defined function name cannot be an empty string');
|
||||||
|
|
||||||
|
// Interpret options
|
||||||
|
const start = 'start' in options ? options.start : null;
|
||||||
|
const step = getFunctionOption(options, 'step', true);
|
||||||
|
const inverse = getFunctionOption(options, 'inverse', false);
|
||||||
|
const result = getFunctionOption(options, 'result', false);
|
||||||
|
const safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;
|
||||||
|
const deterministic = getBooleanOption(options, 'deterministic');
|
||||||
|
const directOnly = getBooleanOption(options, 'directOnly');
|
||||||
|
const varargs = getBooleanOption(options, 'varargs');
|
||||||
|
let argCount = -1;
|
||||||
|
|
||||||
|
// Determine argument count
|
||||||
|
if (!varargs) {
|
||||||
|
argCount = Math.max(getLength(step), inverse ? getLength(inverse) : 0);
|
||||||
|
if (argCount > 0) argCount -= 1;
|
||||||
|
if (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');
|
||||||
|
}
|
||||||
|
|
||||||
|
this[cppdb].aggregate(start, step, inverse, result, name, argCount, safeIntegers, deterministic, directOnly);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getFunctionOption = (options, key, required) => {
|
||||||
|
const value = key in options ? options[key] : null;
|
||||||
|
if (typeof value === 'function') return value;
|
||||||
|
if (value != null) throw new TypeError(`Expected the "${key}" option to be a function`);
|
||||||
|
if (required) throw new TypeError(`Missing required option "${key}"`);
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getLength = ({ length }) => {
|
||||||
|
if (Number.isInteger(length) && length >= 0) return length;
|
||||||
|
throw new TypeError('Expected function.length to be a positive integer');
|
||||||
|
};
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
'use strict';
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { promisify } = require('util');
|
||||||
|
const { cppdb } = require('../util');
|
||||||
|
const fsAccess = promisify(fs.access);
|
||||||
|
|
||||||
|
module.exports = async function backup(filename, options) {
|
||||||
|
if (options == null) options = {};
|
||||||
|
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof filename !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');
|
||||||
|
|
||||||
|
// Interpret options
|
||||||
|
filename = filename.trim();
|
||||||
|
const attachedName = 'attached' in options ? options.attached : 'main';
|
||||||
|
const handler = 'progress' in options ? options.progress : null;
|
||||||
|
|
||||||
|
// Validate interpreted options
|
||||||
|
if (!filename) throw new TypeError('Backup filename cannot be an empty string');
|
||||||
|
if (filename === ':memory:') throw new TypeError('Invalid backup filename ":memory:"');
|
||||||
|
if (typeof attachedName !== 'string') throw new TypeError('Expected the "attached" option to be a string');
|
||||||
|
if (!attachedName) throw new TypeError('The "attached" option cannot be an empty string');
|
||||||
|
if (handler != null && typeof handler !== 'function') throw new TypeError('Expected the "progress" option to be a function');
|
||||||
|
|
||||||
|
// Make sure the specified directory exists
|
||||||
|
await fsAccess(path.dirname(filename)).catch(() => {
|
||||||
|
throw new TypeError('Cannot save backup because the directory does not exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
const isNewFile = await fsAccess(filename).then(() => false, () => true);
|
||||||
|
return runBackup(this[cppdb].backup(this, attachedName, filename, isNewFile), handler || null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const runBackup = (backup, handler) => {
|
||||||
|
let rate = 0;
|
||||||
|
let useDefault = true;
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setImmediate(function step() {
|
||||||
|
try {
|
||||||
|
const progress = backup.transfer(rate);
|
||||||
|
if (!progress.remainingPages) {
|
||||||
|
backup.close();
|
||||||
|
resolve(progress);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (useDefault) {
|
||||||
|
useDefault = false;
|
||||||
|
rate = 100;
|
||||||
|
}
|
||||||
|
if (handler) {
|
||||||
|
const ret = handler(progress);
|
||||||
|
if (ret !== undefined) {
|
||||||
|
if (typeof ret === 'number' && ret === ret) rate = Math.max(0, Math.min(0x7fffffff, Math.round(ret)));
|
||||||
|
else throw new TypeError('Expected progress callback to return a number or undefined');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setImmediate(step);
|
||||||
|
} catch (err) {
|
||||||
|
backup.close();
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
'use strict';
|
||||||
|
const { getBooleanOption, cppdb } = require('../util');
|
||||||
|
|
||||||
|
module.exports = function defineFunction(name, options, fn) {
|
||||||
|
// Apply defaults
|
||||||
|
if (options == null) options = {};
|
||||||
|
if (typeof options === 'function') { fn = options; options = {}; }
|
||||||
|
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (typeof fn !== 'function') throw new TypeError('Expected last argument to be a function');
|
||||||
|
if (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');
|
||||||
|
if (!name) throw new TypeError('User-defined function name cannot be an empty string');
|
||||||
|
|
||||||
|
// Interpret options
|
||||||
|
const safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;
|
||||||
|
const deterministic = getBooleanOption(options, 'deterministic');
|
||||||
|
const directOnly = getBooleanOption(options, 'directOnly');
|
||||||
|
const varargs = getBooleanOption(options, 'varargs');
|
||||||
|
let argCount = -1;
|
||||||
|
|
||||||
|
// Determine argument count
|
||||||
|
if (!varargs) {
|
||||||
|
argCount = fn.length;
|
||||||
|
if (!Number.isInteger(argCount) || argCount < 0) throw new TypeError('Expected function.length to be a positive integer');
|
||||||
|
if (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');
|
||||||
|
}
|
||||||
|
|
||||||
|
this[cppdb].function(fn, name, argCount, safeIntegers, deterministic, directOnly);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
'use strict';
|
||||||
|
const DatabaseInspection = function Database() {};
|
||||||
|
|
||||||
|
module.exports = function inspect(depth, opts) {
|
||||||
|
return Object.assign(new DatabaseInspection(), this);
|
||||||
|
};
|
||||||
|
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict';
|
||||||
|
const { getBooleanOption, cppdb } = require('../util');
|
||||||
|
|
||||||
|
module.exports = function pragma(source, options) {
|
||||||
|
if (options == null) options = {};
|
||||||
|
if (typeof source !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');
|
||||||
|
const simple = getBooleanOption(options, 'simple');
|
||||||
|
|
||||||
|
const stmt = this[cppdb].prepare(`PRAGMA ${source}`, this, true);
|
||||||
|
return simple ? stmt.pluck().get() : stmt.all();
|
||||||
|
};
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
'use strict';
|
||||||
|
const { cppdb } = require('../util');
|
||||||
|
|
||||||
|
module.exports = function serialize(options) {
|
||||||
|
if (options == null) options = {};
|
||||||
|
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof options !== 'object') throw new TypeError('Expected first argument to be an options object');
|
||||||
|
|
||||||
|
// Interpret and validate options
|
||||||
|
const attachedName = 'attached' in options ? options.attached : 'main';
|
||||||
|
if (typeof attachedName !== 'string') throw new TypeError('Expected the "attached" option to be a string');
|
||||||
|
if (!attachedName) throw new TypeError('The "attached" option cannot be an empty string');
|
||||||
|
|
||||||
|
return this[cppdb].serialize(attachedName);
|
||||||
|
};
|
||||||
+189
@@ -0,0 +1,189 @@
|
|||||||
|
'use strict';
|
||||||
|
const { cppdb } = require('../util');
|
||||||
|
|
||||||
|
module.exports = function defineTable(name, factory) {
|
||||||
|
// Validate arguments
|
||||||
|
if (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');
|
||||||
|
if (!name) throw new TypeError('Virtual table module name cannot be an empty string');
|
||||||
|
|
||||||
|
// Determine whether the module is eponymous-only or not
|
||||||
|
let eponymous = false;
|
||||||
|
if (typeof factory === 'object' && factory !== null) {
|
||||||
|
eponymous = true;
|
||||||
|
factory = defer(parseTableDefinition(factory, 'used', name));
|
||||||
|
} else {
|
||||||
|
if (typeof factory !== 'function') throw new TypeError('Expected second argument to be a function or a table definition object');
|
||||||
|
factory = wrapFactory(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
this[cppdb].table(factory, name, eponymous);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
function wrapFactory(factory) {
|
||||||
|
return function virtualTableFactory(moduleName, databaseName, tableName, ...args) {
|
||||||
|
const thisObject = {
|
||||||
|
module: moduleName,
|
||||||
|
database: databaseName,
|
||||||
|
table: tableName,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Generate a new table definition by invoking the factory
|
||||||
|
const def = apply.call(factory, thisObject, args);
|
||||||
|
if (typeof def !== 'object' || def === null) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" did not return a table definition object`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseTableDefinition(def, 'returned', moduleName);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTableDefinition(def, verb, moduleName) {
|
||||||
|
// Validate required properties
|
||||||
|
if (!hasOwnProperty.call(def, 'rows')) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition without a "rows" property`);
|
||||||
|
}
|
||||||
|
if (!hasOwnProperty.call(def, 'columns')) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition without a "columns" property`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate "rows" property
|
||||||
|
const rows = def.rows;
|
||||||
|
if (typeof rows !== 'function' || Object.getPrototypeOf(rows) !== GeneratorFunctionPrototype) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "rows" property (should be a generator function)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate "columns" property
|
||||||
|
let columns = def.columns;
|
||||||
|
if (!Array.isArray(columns) || !(columns = [...columns]).every(x => typeof x === 'string')) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "columns" property (should be an array of strings)`);
|
||||||
|
}
|
||||||
|
if (columns.length !== new Set(columns).size) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with duplicate column names`);
|
||||||
|
}
|
||||||
|
if (!columns.length) {
|
||||||
|
throw new RangeError(`Virtual table module "${moduleName}" ${verb} a table definition with zero columns`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate "parameters" property
|
||||||
|
let parameters;
|
||||||
|
if (hasOwnProperty.call(def, 'parameters')) {
|
||||||
|
parameters = def.parameters;
|
||||||
|
if (!Array.isArray(parameters) || !(parameters = [...parameters]).every(x => typeof x === 'string')) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "parameters" property (should be an array of strings)`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
parameters = inferParameters(rows);
|
||||||
|
}
|
||||||
|
if (parameters.length !== new Set(parameters).size) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with duplicate parameter names`);
|
||||||
|
}
|
||||||
|
if (parameters.length > 32) {
|
||||||
|
throw new RangeError(`Virtual table module "${moduleName}" ${verb} a table definition with more than the maximum number of 32 parameters`);
|
||||||
|
}
|
||||||
|
for (const parameter of parameters) {
|
||||||
|
if (columns.includes(parameter)) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with column "${parameter}" which was ambiguously defined as both a column and parameter`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate "safeIntegers" option
|
||||||
|
let safeIntegers = 2;
|
||||||
|
if (hasOwnProperty.call(def, 'safeIntegers')) {
|
||||||
|
const bool = def.safeIntegers;
|
||||||
|
if (typeof bool !== 'boolean') {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "safeIntegers" property (should be a boolean)`);
|
||||||
|
}
|
||||||
|
safeIntegers = +bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate "directOnly" option
|
||||||
|
let directOnly = false;
|
||||||
|
if (hasOwnProperty.call(def, 'directOnly')) {
|
||||||
|
directOnly = def.directOnly;
|
||||||
|
if (typeof directOnly !== 'boolean') {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" ${verb} a table definition with an invalid "directOnly" property (should be a boolean)`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate SQL for the virtual table definition
|
||||||
|
const columnDefinitions = [
|
||||||
|
...parameters.map(identifier).map(str => `${str} HIDDEN`),
|
||||||
|
...columns.map(identifier),
|
||||||
|
];
|
||||||
|
return [
|
||||||
|
`CREATE TABLE x(${columnDefinitions.join(', ')});`,
|
||||||
|
wrapGenerator(rows, new Map(columns.map((x, i) => [x, parameters.length + i])), moduleName),
|
||||||
|
parameters,
|
||||||
|
safeIntegers,
|
||||||
|
directOnly,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function wrapGenerator(generator, columnMap, moduleName) {
|
||||||
|
return function* virtualTable(...args) {
|
||||||
|
/*
|
||||||
|
We must defensively clone any buffers in the arguments, because
|
||||||
|
otherwise the generator could mutate one of them, which would cause
|
||||||
|
us to return incorrect values for hidden columns, potentially
|
||||||
|
corrupting the database.
|
||||||
|
*/
|
||||||
|
const output = args.map(x => Buffer.isBuffer(x) ? Buffer.from(x) : x);
|
||||||
|
for (let i = 0; i < columnMap.size; ++i) {
|
||||||
|
output.push(null); // Fill with nulls to prevent gaps in array (v8 optimization)
|
||||||
|
}
|
||||||
|
for (const row of generator(...args)) {
|
||||||
|
if (Array.isArray(row)) {
|
||||||
|
extractRowArray(row, output, columnMap.size, moduleName);
|
||||||
|
yield output;
|
||||||
|
} else if (typeof row === 'object' && row !== null) {
|
||||||
|
extractRowObject(row, output, columnMap, moduleName);
|
||||||
|
yield output;
|
||||||
|
} else {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" yielded something that isn't a valid row object`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractRowArray(row, output, columnCount, moduleName) {
|
||||||
|
if (row.length !== columnCount) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" yielded a row with an incorrect number of columns`);
|
||||||
|
}
|
||||||
|
const offset = output.length - columnCount;
|
||||||
|
for (let i = 0; i < columnCount; ++i) {
|
||||||
|
output[i + offset] = row[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractRowObject(row, output, columnMap, moduleName) {
|
||||||
|
let count = 0;
|
||||||
|
for (const key of Object.keys(row)) {
|
||||||
|
const index = columnMap.get(key);
|
||||||
|
if (index === undefined) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" yielded a row with an undeclared column "${key}"`);
|
||||||
|
}
|
||||||
|
output[index] = row[key];
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
if (count !== columnMap.size) {
|
||||||
|
throw new TypeError(`Virtual table module "${moduleName}" yielded a row with missing columns`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function inferParameters({ length }) {
|
||||||
|
if (!Number.isInteger(length) || length < 0) {
|
||||||
|
throw new TypeError('Expected function.length to be a positive integer');
|
||||||
|
}
|
||||||
|
const params = [];
|
||||||
|
for (let i = 0; i < length; ++i) {
|
||||||
|
params.push(`$${i + 1}`);
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { hasOwnProperty } = Object.prototype;
|
||||||
|
const { apply } = Function.prototype;
|
||||||
|
const GeneratorFunctionPrototype = Object.getPrototypeOf(function*(){});
|
||||||
|
const identifier = str => `"${str.replace(/"/g, '""')}"`;
|
||||||
|
const defer = x => () => x;
|
||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
'use strict';
|
||||||
|
const { cppdb } = require('../util');
|
||||||
|
const controllers = new WeakMap();
|
||||||
|
|
||||||
|
module.exports = function transaction(fn) {
|
||||||
|
if (typeof fn !== 'function') throw new TypeError('Expected first argument to be a function');
|
||||||
|
|
||||||
|
const db = this[cppdb];
|
||||||
|
const controller = getController(db, this);
|
||||||
|
const { apply } = Function.prototype;
|
||||||
|
|
||||||
|
// Each version of the transaction function has these same properties
|
||||||
|
const properties = {
|
||||||
|
default: { value: wrapTransaction(apply, fn, db, controller.default) },
|
||||||
|
deferred: { value: wrapTransaction(apply, fn, db, controller.deferred) },
|
||||||
|
immediate: { value: wrapTransaction(apply, fn, db, controller.immediate) },
|
||||||
|
exclusive: { value: wrapTransaction(apply, fn, db, controller.exclusive) },
|
||||||
|
database: { value: this, enumerable: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.defineProperties(properties.default.value, properties);
|
||||||
|
Object.defineProperties(properties.deferred.value, properties);
|
||||||
|
Object.defineProperties(properties.immediate.value, properties);
|
||||||
|
Object.defineProperties(properties.exclusive.value, properties);
|
||||||
|
|
||||||
|
// Return the default version of the transaction function
|
||||||
|
return properties.default.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return the database's cached transaction controller, or create a new one
|
||||||
|
const getController = (db, self) => {
|
||||||
|
let controller = controllers.get(db);
|
||||||
|
if (!controller) {
|
||||||
|
const shared = {
|
||||||
|
commit: db.prepare('COMMIT', self, false),
|
||||||
|
rollback: db.prepare('ROLLBACK', self, false),
|
||||||
|
savepoint: db.prepare('SAVEPOINT `\t_bs3.\t`', self, false),
|
||||||
|
release: db.prepare('RELEASE `\t_bs3.\t`', self, false),
|
||||||
|
rollbackTo: db.prepare('ROLLBACK TO `\t_bs3.\t`', self, false),
|
||||||
|
};
|
||||||
|
controllers.set(db, controller = {
|
||||||
|
default: Object.assign({ begin: db.prepare('BEGIN', self, false) }, shared),
|
||||||
|
deferred: Object.assign({ begin: db.prepare('BEGIN DEFERRED', self, false) }, shared),
|
||||||
|
immediate: Object.assign({ begin: db.prepare('BEGIN IMMEDIATE', self, false) }, shared),
|
||||||
|
exclusive: Object.assign({ begin: db.prepare('BEGIN EXCLUSIVE', self, false) }, shared),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return controller;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return a new transaction function by wrapping the given function
|
||||||
|
const wrapTransaction = (apply, fn, db, { begin, commit, rollback, savepoint, release, rollbackTo }) => function sqliteTransaction() {
|
||||||
|
let before, after, undo;
|
||||||
|
if (db.inTransaction) {
|
||||||
|
before = savepoint;
|
||||||
|
after = release;
|
||||||
|
undo = rollbackTo;
|
||||||
|
} else {
|
||||||
|
before = begin;
|
||||||
|
after = commit;
|
||||||
|
undo = rollback;
|
||||||
|
}
|
||||||
|
before.run();
|
||||||
|
try {
|
||||||
|
const result = apply.call(fn, this, arguments);
|
||||||
|
after.run();
|
||||||
|
return result;
|
||||||
|
} catch (ex) {
|
||||||
|
if (db.inTransaction) {
|
||||||
|
undo.run();
|
||||||
|
if (undo !== rollback) after.run();
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
};
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
'use strict';
|
||||||
|
const { cppdb } = require('../util');
|
||||||
|
|
||||||
|
exports.prepare = function prepare(sql) {
|
||||||
|
return this[cppdb].prepare(sql, this, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.exec = function exec(sql) {
|
||||||
|
this[cppdb].exec(sql);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.close = function close() {
|
||||||
|
this[cppdb].close();
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.loadExtension = function loadExtension(...args) {
|
||||||
|
this[cppdb].loadExtension(...args);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.defaultSafeIntegers = function defaultSafeIntegers(...args) {
|
||||||
|
this[cppdb].defaultSafeIntegers(...args);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.unsafeMode = function unsafeMode(...args) {
|
||||||
|
this[cppdb].unsafeMode(...args);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.getters = {
|
||||||
|
name: {
|
||||||
|
get: function name() { return this[cppdb].name; },
|
||||||
|
enumerable: true,
|
||||||
|
},
|
||||||
|
open: {
|
||||||
|
get: function open() { return this[cppdb].open; },
|
||||||
|
enumerable: true,
|
||||||
|
},
|
||||||
|
inTransaction: {
|
||||||
|
get: function inTransaction() { return this[cppdb].inTransaction; },
|
||||||
|
enumerable: true,
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
get: function readonly() { return this[cppdb].readonly; },
|
||||||
|
enumerable: true,
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
get: function memory() { return this[cppdb].memory; },
|
||||||
|
enumerable: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
'use strict';
|
||||||
|
const descriptor = { value: 'SqliteError', writable: true, enumerable: false, configurable: true };
|
||||||
|
|
||||||
|
function SqliteError(message, code) {
|
||||||
|
if (new.target !== SqliteError) {
|
||||||
|
return new SqliteError(message, code);
|
||||||
|
}
|
||||||
|
if (typeof code !== 'string') {
|
||||||
|
throw new TypeError('Expected second argument to be a string');
|
||||||
|
}
|
||||||
|
Error.call(this, message);
|
||||||
|
descriptor.value = '' + message;
|
||||||
|
Object.defineProperty(this, 'message', descriptor);
|
||||||
|
Error.captureStackTrace(this, SqliteError);
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
Object.setPrototypeOf(SqliteError, Error);
|
||||||
|
Object.setPrototypeOf(SqliteError.prototype, Error.prototype);
|
||||||
|
Object.defineProperty(SqliteError.prototype, 'name', descriptor);
|
||||||
|
module.exports = SqliteError;
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
exports.getBooleanOption = (options, key) => {
|
||||||
|
let value = false;
|
||||||
|
if (key in options && typeof (value = options[key]) !== 'boolean') {
|
||||||
|
throw new TypeError(`Expected the "${key}" option to be a boolean`);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.cppdb = Symbol();
|
||||||
|
exports.inspect = Symbol.for('nodejs.util.inspect.custom');
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"name": "better-sqlite3",
|
||||||
|
"version": "9.6.0",
|
||||||
|
"description": "The fastest and simplest library for SQLite3 in Node.js.",
|
||||||
|
"homepage": "http://github.com/WiseLibs/better-sqlite3",
|
||||||
|
"author": "Joshua Wise <joshuathomaswise@gmail.com>",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/WiseLibs/better-sqlite3.git"
|
||||||
|
},
|
||||||
|
"main": "lib/index.js",
|
||||||
|
"files": [
|
||||||
|
"binding.gyp",
|
||||||
|
"src/*.[ch]pp",
|
||||||
|
"lib/**",
|
||||||
|
"deps/**"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"bindings": "^1.5.0",
|
||||||
|
"prebuild-install": "^7.1.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"chai": "^4.3.8",
|
||||||
|
"cli-color": "^2.0.3",
|
||||||
|
"fs-extra": "^11.1.1",
|
||||||
|
"mocha": "^10.2.0",
|
||||||
|
"nodemark": "^0.3.0",
|
||||||
|
"prebuild": "^13.0.0",
|
||||||
|
"sqlite": "^5.0.1",
|
||||||
|
"sqlite3": "^5.1.6"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"install": "prebuild-install || node-gyp rebuild --release",
|
||||||
|
"build-release": "node-gyp rebuild --release",
|
||||||
|
"build-debug": "node-gyp rebuild --debug",
|
||||||
|
"rebuild-release": "npm run lzz && npm run build-release",
|
||||||
|
"rebuild-debug": "npm run lzz && npm run build-debug",
|
||||||
|
"test": "mocha --exit --slow=75 --timeout=5000",
|
||||||
|
"benchmark": "node benchmark",
|
||||||
|
"download": "bash ./deps/download.sh",
|
||||||
|
"lzz": "lzz -hx hpp -sx cpp -k BETTER_SQLITE3 -d -hl -sl -e ./src/better_sqlite3.lzz"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"sql",
|
||||||
|
"sqlite",
|
||||||
|
"sqlite3",
|
||||||
|
"transactions",
|
||||||
|
"user-defined functions",
|
||||||
|
"aggregate functions",
|
||||||
|
"window functions",
|
||||||
|
"database"
|
||||||
|
]
|
||||||
|
}
|
||||||
+2165
File diff suppressed because it is too large
Load Diff
+1038
File diff suppressed because it is too large
Load Diff
+22
@@ -0,0 +1,22 @@
|
|||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
+98
@@ -0,0 +1,98 @@
|
|||||||
|
node-bindings
|
||||||
|
=============
|
||||||
|
### Helper module for loading your native module's `.node` file
|
||||||
|
|
||||||
|
This is a helper module for authors of Node.js native addon modules.
|
||||||
|
It is basically the "swiss army knife" of `require()`ing your native module's
|
||||||
|
`.node` file.
|
||||||
|
|
||||||
|
Throughout the course of Node's native addon history, addons have ended up being
|
||||||
|
compiled in a variety of different places, depending on which build tool and which
|
||||||
|
version of node was used. To make matters worse, now the `gyp` build tool can
|
||||||
|
produce either a __Release__ or __Debug__ build, each being built into different
|
||||||
|
locations.
|
||||||
|
|
||||||
|
This module checks _all_ the possible locations that a native addon would be built
|
||||||
|
at, and returns the first one that loads successfully.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Install with `npm`:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ npm install --save bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
Or add it to the `"dependencies"` section of your `package.json` file.
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
`require()`ing the proper bindings file for the current node version, platform
|
||||||
|
and architecture is as simple as:
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var bindings = require('bindings')('binding.node')
|
||||||
|
|
||||||
|
// Use your bindings defined in your C files
|
||||||
|
bindings.your_c_function()
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Nice Error Output
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
When the `.node` file could not be loaded, `node-bindings` throws an Error with
|
||||||
|
a nice error message telling you exactly what was tried. You can also check the
|
||||||
|
`err.tries` Array property.
|
||||||
|
|
||||||
|
```
|
||||||
|
Error: Could not load the bindings file. Tried:
|
||||||
|
→ /Users/nrajlich/ref/build/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/out/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/out/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/default/binding.node
|
||||||
|
→ /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node
|
||||||
|
at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)
|
||||||
|
at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)
|
||||||
|
at Module._compile (module.js:449:26)
|
||||||
|
at Object.Module._extensions..js (module.js:467:10)
|
||||||
|
at Module.load (module.js:356:32)
|
||||||
|
at Function.Module._load (module.js:312:12)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
+221
@@ -0,0 +1,221 @@
|
|||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs'),
|
||||||
|
path = require('path'),
|
||||||
|
fileURLToPath = require('file-uri-to-path'),
|
||||||
|
join = path.join,
|
||||||
|
dirname = path.dirname,
|
||||||
|
exists =
|
||||||
|
(fs.accessSync &&
|
||||||
|
function(path) {
|
||||||
|
try {
|
||||||
|
fs.accessSync(path);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}) ||
|
||||||
|
fs.existsSync ||
|
||||||
|
path.existsSync,
|
||||||
|
defaults = {
|
||||||
|
arrow: process.env.NODE_BINDINGS_ARROW || ' → ',
|
||||||
|
compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled',
|
||||||
|
platform: process.platform,
|
||||||
|
arch: process.arch,
|
||||||
|
nodePreGyp:
|
||||||
|
'node-v' +
|
||||||
|
process.versions.modules +
|
||||||
|
'-' +
|
||||||
|
process.platform +
|
||||||
|
'-' +
|
||||||
|
process.arch,
|
||||||
|
version: process.versions.node,
|
||||||
|
bindings: 'bindings.node',
|
||||||
|
try: [
|
||||||
|
// node-gyp's linked version in the "build" dir
|
||||||
|
['module_root', 'build', 'bindings'],
|
||||||
|
// node-waf and gyp_addon (a.k.a node-gyp)
|
||||||
|
['module_root', 'build', 'Debug', 'bindings'],
|
||||||
|
['module_root', 'build', 'Release', 'bindings'],
|
||||||
|
// Debug files, for development (legacy behavior, remove for node v0.9)
|
||||||
|
['module_root', 'out', 'Debug', 'bindings'],
|
||||||
|
['module_root', 'Debug', 'bindings'],
|
||||||
|
// Release files, but manually compiled (legacy behavior, remove for node v0.9)
|
||||||
|
['module_root', 'out', 'Release', 'bindings'],
|
||||||
|
['module_root', 'Release', 'bindings'],
|
||||||
|
// Legacy from node-waf, node <= 0.4.x
|
||||||
|
['module_root', 'build', 'default', 'bindings'],
|
||||||
|
// Production "Release" buildtype binary (meh...)
|
||||||
|
['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'],
|
||||||
|
// node-qbs builds
|
||||||
|
['module_root', 'addon-build', 'release', 'install-root', 'bindings'],
|
||||||
|
['module_root', 'addon-build', 'debug', 'install-root', 'bindings'],
|
||||||
|
['module_root', 'addon-build', 'default', 'install-root', 'bindings'],
|
||||||
|
// node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch}
|
||||||
|
['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings']
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main `bindings()` function loads the compiled bindings for a given module.
|
||||||
|
* It uses V8's Error API to determine the parent filename that this function is
|
||||||
|
* being invoked from, which is then used to find the root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function bindings(opts) {
|
||||||
|
// Argument surgery
|
||||||
|
if (typeof opts == 'string') {
|
||||||
|
opts = { bindings: opts };
|
||||||
|
} else if (!opts) {
|
||||||
|
opts = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps `defaults` onto `opts` object
|
||||||
|
Object.keys(defaults).map(function(i) {
|
||||||
|
if (!(i in opts)) opts[i] = defaults[i];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the module root
|
||||||
|
if (!opts.module_root) {
|
||||||
|
opts.module_root = exports.getRoot(exports.getFileName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the given bindings name ends with .node
|
||||||
|
if (path.extname(opts.bindings) != '.node') {
|
||||||
|
opts.bindings += '.node';
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/webpack/webpack/issues/4175#issuecomment-342931035
|
||||||
|
var requireFunc =
|
||||||
|
typeof __webpack_require__ === 'function'
|
||||||
|
? __non_webpack_require__
|
||||||
|
: require;
|
||||||
|
|
||||||
|
var tries = [],
|
||||||
|
i = 0,
|
||||||
|
l = opts.try.length,
|
||||||
|
n,
|
||||||
|
b,
|
||||||
|
err;
|
||||||
|
|
||||||
|
for (; i < l; i++) {
|
||||||
|
n = join.apply(
|
||||||
|
null,
|
||||||
|
opts.try[i].map(function(p) {
|
||||||
|
return opts[p] || p;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
tries.push(n);
|
||||||
|
try {
|
||||||
|
b = opts.path ? requireFunc.resolve(n) : requireFunc(n);
|
||||||
|
if (!opts.path) {
|
||||||
|
b.path = n;
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code !== 'MODULE_NOT_FOUND' &&
|
||||||
|
e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' &&
|
||||||
|
!/not find/i.test(e.message)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = new Error(
|
||||||
|
'Could not locate the bindings file. Tried:\n' +
|
||||||
|
tries
|
||||||
|
.map(function(a) {
|
||||||
|
return opts.arrow + a;
|
||||||
|
})
|
||||||
|
.join('\n')
|
||||||
|
);
|
||||||
|
err.tries = tries;
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
module.exports = exports = bindings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the filename of the JavaScript file that invokes this function.
|
||||||
|
* Used to help find the root directory of a module.
|
||||||
|
* Optionally accepts an filename argument to skip when searching for the invoking filename
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.getFileName = function getFileName(calling_file) {
|
||||||
|
var origPST = Error.prepareStackTrace,
|
||||||
|
origSTL = Error.stackTraceLimit,
|
||||||
|
dummy = {},
|
||||||
|
fileName;
|
||||||
|
|
||||||
|
Error.stackTraceLimit = 10;
|
||||||
|
|
||||||
|
Error.prepareStackTrace = function(e, st) {
|
||||||
|
for (var i = 0, l = st.length; i < l; i++) {
|
||||||
|
fileName = st[i].getFileName();
|
||||||
|
if (fileName !== __filename) {
|
||||||
|
if (calling_file) {
|
||||||
|
if (fileName !== calling_file) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// run the 'prepareStackTrace' function above
|
||||||
|
Error.captureStackTrace(dummy);
|
||||||
|
dummy.stack;
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
Error.prepareStackTrace = origPST;
|
||||||
|
Error.stackTraceLimit = origSTL;
|
||||||
|
|
||||||
|
// handle filename that starts with "file://"
|
||||||
|
var fileSchema = 'file://';
|
||||||
|
if (fileName.indexOf(fileSchema) === 0) {
|
||||||
|
fileName = fileURLToPath(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileName;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the root directory of a module, given an arbitrary filename
|
||||||
|
* somewhere in the module tree. The "root directory" is the directory
|
||||||
|
* containing the `package.json` file.
|
||||||
|
*
|
||||||
|
* In: /home/nate/node-native-module/lib/index.js
|
||||||
|
* Out: /home/nate/node-native-module
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.getRoot = function getRoot(file) {
|
||||||
|
var dir = dirname(file),
|
||||||
|
prev;
|
||||||
|
while (true) {
|
||||||
|
if (dir === '.') {
|
||||||
|
// Avoids an infinite loop in rare cases, like the REPL
|
||||||
|
dir = process.cwd();
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
exists(join(dir, 'package.json')) ||
|
||||||
|
exists(join(dir, 'node_modules'))
|
||||||
|
) {
|
||||||
|
// Found the 'package.json' file or 'node_modules' dir; we're done
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
if (prev === dir) {
|
||||||
|
// Got to the top
|
||||||
|
throw new Error(
|
||||||
|
'Could not find module root given file: "' +
|
||||||
|
file +
|
||||||
|
'". Do you have a `package.json` file? '
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Try the parent dir next
|
||||||
|
prev = dir;
|
||||||
|
dir = join(dir, '..');
|
||||||
|
}
|
||||||
|
};
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "bindings",
|
||||||
|
"description": "Helper module for loading your native module's .node file",
|
||||||
|
"keywords": [
|
||||||
|
"native",
|
||||||
|
"addon",
|
||||||
|
"bindings",
|
||||||
|
"gyp",
|
||||||
|
"waf",
|
||||||
|
"c",
|
||||||
|
"c++"
|
||||||
|
],
|
||||||
|
"version": "1.5.0",
|
||||||
|
"author": "Nathan Rajlich <nathan@tootallnate.net> (http://tootallnate.net)",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/TooTallNate/node-bindings.git"
|
||||||
|
},
|
||||||
|
"main": "./bindings.js",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/TooTallNate/node-bindings/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/TooTallNate/node-bindings",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"file-uri-to-path": "1.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
sudo: false
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- ppc64le
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- '6'
|
||||||
|
- '8'
|
||||||
|
- '10'
|
||||||
|
- '12'
|
||||||
|
- '14'
|
||||||
|
- '15'
|
||||||
|
- lts/*
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
- rod@vagg.org
|
||||||
|
- matteo.collina@gmail.com
|
||||||
+396
@@ -0,0 +1,396 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const { Buffer } = require('buffer')
|
||||||
|
const symbol = Symbol.for('BufferList')
|
||||||
|
|
||||||
|
function BufferList (buf) {
|
||||||
|
if (!(this instanceof BufferList)) {
|
||||||
|
return new BufferList(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList._init.call(this, buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList._init = function _init (buf) {
|
||||||
|
Object.defineProperty(this, symbol, { value: true })
|
||||||
|
|
||||||
|
this._bufs = []
|
||||||
|
this.length = 0
|
||||||
|
|
||||||
|
if (buf) {
|
||||||
|
this.append(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype._new = function _new (buf) {
|
||||||
|
return new BufferList(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype._offset = function _offset (offset) {
|
||||||
|
if (offset === 0) {
|
||||||
|
return [0, 0]
|
||||||
|
}
|
||||||
|
|
||||||
|
let tot = 0
|
||||||
|
|
||||||
|
for (let i = 0; i < this._bufs.length; i++) {
|
||||||
|
const _t = tot + this._bufs[i].length
|
||||||
|
if (offset < _t || i === this._bufs.length - 1) {
|
||||||
|
return [i, offset - tot]
|
||||||
|
}
|
||||||
|
tot = _t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype._reverseOffset = function (blOffset) {
|
||||||
|
const bufferId = blOffset[0]
|
||||||
|
let offset = blOffset[1]
|
||||||
|
|
||||||
|
for (let i = 0; i < bufferId; i++) {
|
||||||
|
offset += this._bufs[i].length
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.get = function get (index) {
|
||||||
|
if (index > this.length || index < 0) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const offset = this._offset(index)
|
||||||
|
|
||||||
|
return this._bufs[offset[0]][offset[1]]
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.slice = function slice (start, end) {
|
||||||
|
if (typeof start === 'number' && start < 0) {
|
||||||
|
start += this.length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof end === 'number' && end < 0) {
|
||||||
|
end += this.length
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.copy(null, 0, start, end)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
|
||||||
|
if (typeof srcStart !== 'number' || srcStart < 0) {
|
||||||
|
srcStart = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof srcEnd !== 'number' || srcEnd > this.length) {
|
||||||
|
srcEnd = this.length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srcStart >= this.length) {
|
||||||
|
return dst || Buffer.alloc(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srcEnd <= 0) {
|
||||||
|
return dst || Buffer.alloc(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
const copy = !!dst
|
||||||
|
const off = this._offset(srcStart)
|
||||||
|
const len = srcEnd - srcStart
|
||||||
|
let bytes = len
|
||||||
|
let bufoff = (copy && dstStart) || 0
|
||||||
|
let start = off[1]
|
||||||
|
|
||||||
|
// copy/slice everything
|
||||||
|
if (srcStart === 0 && srcEnd === this.length) {
|
||||||
|
if (!copy) {
|
||||||
|
// slice, but full concat if multiple buffers
|
||||||
|
return this._bufs.length === 1
|
||||||
|
? this._bufs[0]
|
||||||
|
: Buffer.concat(this._bufs, this.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy, need to copy individual buffers
|
||||||
|
for (let i = 0; i < this._bufs.length; i++) {
|
||||||
|
this._bufs[i].copy(dst, bufoff)
|
||||||
|
bufoff += this._bufs[i].length
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// easy, cheap case where it's a subset of one of the buffers
|
||||||
|
if (bytes <= this._bufs[off[0]].length - start) {
|
||||||
|
return copy
|
||||||
|
? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
|
||||||
|
: this._bufs[off[0]].slice(start, start + bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!copy) {
|
||||||
|
// a slice, we need something to copy in to
|
||||||
|
dst = Buffer.allocUnsafe(len)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = off[0]; i < this._bufs.length; i++) {
|
||||||
|
const l = this._bufs[i].length - start
|
||||||
|
|
||||||
|
if (bytes > l) {
|
||||||
|
this._bufs[i].copy(dst, bufoff, start)
|
||||||
|
bufoff += l
|
||||||
|
} else {
|
||||||
|
this._bufs[i].copy(dst, bufoff, start, start + bytes)
|
||||||
|
bufoff += l
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes -= l
|
||||||
|
|
||||||
|
if (start) {
|
||||||
|
start = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// safeguard so that we don't return uninitialized memory
|
||||||
|
if (dst.length > bufoff) return dst.slice(0, bufoff)
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
|
||||||
|
start = start || 0
|
||||||
|
end = typeof end !== 'number' ? this.length : end
|
||||||
|
|
||||||
|
if (start < 0) {
|
||||||
|
start += this.length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end < 0) {
|
||||||
|
end += this.length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start === end) {
|
||||||
|
return this._new()
|
||||||
|
}
|
||||||
|
|
||||||
|
const startOffset = this._offset(start)
|
||||||
|
const endOffset = this._offset(end)
|
||||||
|
const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)
|
||||||
|
|
||||||
|
if (endOffset[1] === 0) {
|
||||||
|
buffers.pop()
|
||||||
|
} else {
|
||||||
|
buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startOffset[1] !== 0) {
|
||||||
|
buffers[0] = buffers[0].slice(startOffset[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._new(buffers)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.toString = function toString (encoding, start, end) {
|
||||||
|
return this.slice(start, end).toString(encoding)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.consume = function consume (bytes) {
|
||||||
|
// first, normalize the argument, in accordance with how Buffer does it
|
||||||
|
bytes = Math.trunc(bytes)
|
||||||
|
// do nothing if not a positive number
|
||||||
|
if (Number.isNaN(bytes) || bytes <= 0) return this
|
||||||
|
|
||||||
|
while (this._bufs.length) {
|
||||||
|
if (bytes >= this._bufs[0].length) {
|
||||||
|
bytes -= this._bufs[0].length
|
||||||
|
this.length -= this._bufs[0].length
|
||||||
|
this._bufs.shift()
|
||||||
|
} else {
|
||||||
|
this._bufs[0] = this._bufs[0].slice(bytes)
|
||||||
|
this.length -= bytes
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.duplicate = function duplicate () {
|
||||||
|
const copy = this._new()
|
||||||
|
|
||||||
|
for (let i = 0; i < this._bufs.length; i++) {
|
||||||
|
copy.append(this._bufs[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.append = function append (buf) {
|
||||||
|
if (buf == null) {
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf.buffer) {
|
||||||
|
// append a view of the underlying ArrayBuffer
|
||||||
|
this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength))
|
||||||
|
} else if (Array.isArray(buf)) {
|
||||||
|
for (let i = 0; i < buf.length; i++) {
|
||||||
|
this.append(buf[i])
|
||||||
|
}
|
||||||
|
} else if (this._isBufferList(buf)) {
|
||||||
|
// unwrap argument into individual BufferLists
|
||||||
|
for (let i = 0; i < buf._bufs.length; i++) {
|
||||||
|
this.append(buf._bufs[i])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// coerce number arguments to strings, since Buffer(number) does
|
||||||
|
// uninitialized memory allocation
|
||||||
|
if (typeof buf === 'number') {
|
||||||
|
buf = buf.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
this._appendBuffer(Buffer.from(buf))
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype._appendBuffer = function appendBuffer (buf) {
|
||||||
|
this._bufs.push(buf)
|
||||||
|
this.length += buf.length
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype.indexOf = function (search, offset, encoding) {
|
||||||
|
if (encoding === undefined && typeof offset === 'string') {
|
||||||
|
encoding = offset
|
||||||
|
offset = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof search === 'function' || Array.isArray(search)) {
|
||||||
|
throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
|
||||||
|
} else if (typeof search === 'number') {
|
||||||
|
search = Buffer.from([search])
|
||||||
|
} else if (typeof search === 'string') {
|
||||||
|
search = Buffer.from(search, encoding)
|
||||||
|
} else if (this._isBufferList(search)) {
|
||||||
|
search = search.slice()
|
||||||
|
} else if (Array.isArray(search.buffer)) {
|
||||||
|
search = Buffer.from(search.buffer, search.byteOffset, search.byteLength)
|
||||||
|
} else if (!Buffer.isBuffer(search)) {
|
||||||
|
search = Buffer.from(search)
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = Number(offset || 0)
|
||||||
|
|
||||||
|
if (isNaN(offset)) {
|
||||||
|
offset = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
offset = this.length + offset
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
offset = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search.length === 0) {
|
||||||
|
return offset > this.length ? this.length : offset
|
||||||
|
}
|
||||||
|
|
||||||
|
const blOffset = this._offset(offset)
|
||||||
|
let blIndex = blOffset[0] // index of which internal buffer we're working on
|
||||||
|
let buffOffset = blOffset[1] // offset of the internal buffer we're working on
|
||||||
|
|
||||||
|
// scan over each buffer
|
||||||
|
for (; blIndex < this._bufs.length; blIndex++) {
|
||||||
|
const buff = this._bufs[blIndex]
|
||||||
|
|
||||||
|
while (buffOffset < buff.length) {
|
||||||
|
const availableWindow = buff.length - buffOffset
|
||||||
|
|
||||||
|
if (availableWindow >= search.length) {
|
||||||
|
const nativeSearchResult = buff.indexOf(search, buffOffset)
|
||||||
|
|
||||||
|
if (nativeSearchResult !== -1) {
|
||||||
|
return this._reverseOffset([blIndex, nativeSearchResult])
|
||||||
|
}
|
||||||
|
|
||||||
|
buffOffset = buff.length - search.length + 1 // end of native search window
|
||||||
|
} else {
|
||||||
|
const revOffset = this._reverseOffset([blIndex, buffOffset])
|
||||||
|
|
||||||
|
if (this._match(revOffset, search)) {
|
||||||
|
return revOffset
|
||||||
|
}
|
||||||
|
|
||||||
|
buffOffset++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffOffset = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.prototype._match = function (offset, search) {
|
||||||
|
if (this.length - offset < search.length) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
|
||||||
|
if (this.get(offset + searchOffset) !== search[searchOffset]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
;(function () {
|
||||||
|
const methods = {
|
||||||
|
readDoubleBE: 8,
|
||||||
|
readDoubleLE: 8,
|
||||||
|
readFloatBE: 4,
|
||||||
|
readFloatLE: 4,
|
||||||
|
readInt32BE: 4,
|
||||||
|
readInt32LE: 4,
|
||||||
|
readUInt32BE: 4,
|
||||||
|
readUInt32LE: 4,
|
||||||
|
readInt16BE: 2,
|
||||||
|
readInt16LE: 2,
|
||||||
|
readUInt16BE: 2,
|
||||||
|
readUInt16LE: 2,
|
||||||
|
readInt8: 1,
|
||||||
|
readUInt8: 1,
|
||||||
|
readIntBE: null,
|
||||||
|
readIntLE: null,
|
||||||
|
readUIntBE: null,
|
||||||
|
readUIntLE: null
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const m in methods) {
|
||||||
|
(function (m) {
|
||||||
|
if (methods[m] === null) {
|
||||||
|
BufferList.prototype[m] = function (offset, byteLength) {
|
||||||
|
return this.slice(offset, offset + byteLength)[m](0, byteLength)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BufferList.prototype[m] = function (offset = 0) {
|
||||||
|
return this.slice(offset, offset + methods[m])[m](0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(m))
|
||||||
|
}
|
||||||
|
}())
|
||||||
|
|
||||||
|
// Used internally by the class and also as an indicator of this object being
|
||||||
|
// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
|
||||||
|
// environment because there could be multiple different copies of the
|
||||||
|
// BufferList class and some `BufferList`s might be `BufferList`s.
|
||||||
|
BufferList.prototype._isBufferList = function _isBufferList (b) {
|
||||||
|
return b instanceof BufferList || BufferList.isBufferList(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList.isBufferList = function isBufferList (b) {
|
||||||
|
return b != null && b[symbol]
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = BufferList
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Copyright (c) 2013-2019 bl contributors
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
*bl contributors listed at <https://github.com/rvagg/bl#contributors>*
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
+247
@@ -0,0 +1,247 @@
|
|||||||
|
# bl *(BufferList)*
|
||||||
|
|
||||||
|
[](https://travis-ci.com/rvagg/bl/)
|
||||||
|
|
||||||
|
**A Node.js Buffer list collector, reader and streamer thingy.**
|
||||||
|
|
||||||
|
[](https://nodei.co/npm/bl/)
|
||||||
|
|
||||||
|
**bl** is a storage object for collections of Node Buffers, exposing them with the main Buffer readable API. Also works as a duplex stream so you can collect buffers from a stream that emits them and emit buffers to a stream that consumes them!
|
||||||
|
|
||||||
|
The original buffers are kept intact and copies are only done as necessary. Any reads that require the use of a single original buffer will return a slice of that buffer only (which references the same memory as the original buffer). Reads that span buffers perform concatenation as required and return the results transparently.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferList } = require('bl')
|
||||||
|
|
||||||
|
const bl = new BufferList()
|
||||||
|
bl.append(Buffer.from('abcd'))
|
||||||
|
bl.append(Buffer.from('efg'))
|
||||||
|
bl.append('hi') // bl will also accept & convert Strings
|
||||||
|
bl.append(Buffer.from('j'))
|
||||||
|
bl.append(Buffer.from([ 0x3, 0x4 ]))
|
||||||
|
|
||||||
|
console.log(bl.length) // 12
|
||||||
|
|
||||||
|
console.log(bl.slice(0, 10).toString('ascii')) // 'abcdefghij'
|
||||||
|
console.log(bl.slice(3, 10).toString('ascii')) // 'defghij'
|
||||||
|
console.log(bl.slice(3, 6).toString('ascii')) // 'def'
|
||||||
|
console.log(bl.slice(3, 8).toString('ascii')) // 'defgh'
|
||||||
|
console.log(bl.slice(5, 10).toString('ascii')) // 'fghij'
|
||||||
|
|
||||||
|
console.log(bl.indexOf('def')) // 3
|
||||||
|
console.log(bl.indexOf('asdf')) // -1
|
||||||
|
|
||||||
|
// or just use toString!
|
||||||
|
console.log(bl.toString()) // 'abcdefghij\u0003\u0004'
|
||||||
|
console.log(bl.toString('ascii', 3, 8)) // 'defgh'
|
||||||
|
console.log(bl.toString('ascii', 5, 10)) // 'fghij'
|
||||||
|
|
||||||
|
// other standard Buffer readables
|
||||||
|
console.log(bl.readUInt16BE(10)) // 0x0304
|
||||||
|
console.log(bl.readUInt16LE(10)) // 0x0403
|
||||||
|
```
|
||||||
|
|
||||||
|
Give it a callback in the constructor and use it just like **[concat-stream](https://github.com/maxogden/node-concat-stream)**:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
fs.createReadStream('README.md')
|
||||||
|
.pipe(BufferListStream((err, data) => { // note 'new' isn't strictly required
|
||||||
|
// `data` is a complete Buffer object containing the full data
|
||||||
|
console.log(data.toString())
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that when you use the *callback* method like this, the resulting `data` parameter is a concatenation of all `Buffer` objects in the list. If you want to avoid the overhead of this concatenation (in cases of extreme performance consciousness), then avoid the *callback* method and just listen to `'end'` instead, like a standard Stream.
|
||||||
|
|
||||||
|
Or to fetch a URL using [hyperquest](https://github.com/substack/hyperquest) (should work with [request](http://github.com/mikeal/request) and even plain Node http too!):
|
||||||
|
|
||||||
|
```js
|
||||||
|
const hyperquest = require('hyperquest')
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
|
||||||
|
const url = 'https://raw.github.com/rvagg/bl/master/README.md'
|
||||||
|
|
||||||
|
hyperquest(url).pipe(BufferListStream((err, data) => {
|
||||||
|
console.log(data.toString())
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
Or, use it as a readable stream to recompose a list of Buffers to an output source:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
var bl = new BufferListStream()
|
||||||
|
bl.append(Buffer.from('abcd'))
|
||||||
|
bl.append(Buffer.from('efg'))
|
||||||
|
bl.append(Buffer.from('hi'))
|
||||||
|
bl.append(Buffer.from('j'))
|
||||||
|
|
||||||
|
bl.pipe(fs.createWriteStream('gibberish.txt'))
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
* <a href="#ctor"><code><b>new BufferList([ buf ])</b></code></a>
|
||||||
|
* <a href="#isBufferList"><code><b>BufferList.isBufferList(obj)</b></code></a>
|
||||||
|
* <a href="#length"><code>bl.<b>length</b></code></a>
|
||||||
|
* <a href="#append"><code>bl.<b>append(buffer)</b></code></a>
|
||||||
|
* <a href="#get"><code>bl.<b>get(index)</b></code></a>
|
||||||
|
* <a href="#indexOf"><code>bl.<b>indexOf(value[, byteOffset][, encoding])</b></code></a>
|
||||||
|
* <a href="#slice"><code>bl.<b>slice([ start[, end ] ])</b></code></a>
|
||||||
|
* <a href="#shallowSlice"><code>bl.<b>shallowSlice([ start[, end ] ])</b></code></a>
|
||||||
|
* <a href="#copy"><code>bl.<b>copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])</b></code></a>
|
||||||
|
* <a href="#duplicate"><code>bl.<b>duplicate()</b></code></a>
|
||||||
|
* <a href="#consume"><code>bl.<b>consume(bytes)</b></code></a>
|
||||||
|
* <a href="#toString"><code>bl.<b>toString([encoding, [ start, [ end ]]])</b></code></a>
|
||||||
|
* <a href="#readXX"><code>bl.<b>readDoubleBE()</b></code>, <code>bl.<b>readDoubleLE()</b></code>, <code>bl.<b>readFloatBE()</b></code>, <code>bl.<b>readFloatLE()</b></code>, <code>bl.<b>readInt32BE()</b></code>, <code>bl.<b>readInt32LE()</b></code>, <code>bl.<b>readUInt32BE()</b></code>, <code>bl.<b>readUInt32LE()</b></code>, <code>bl.<b>readInt16BE()</b></code>, <code>bl.<b>readInt16LE()</b></code>, <code>bl.<b>readUInt16BE()</b></code>, <code>bl.<b>readUInt16LE()</b></code>, <code>bl.<b>readInt8()</b></code>, <code>bl.<b>readUInt8()</b></code></a>
|
||||||
|
* <a href="#ctorStream"><code><b>new BufferListStream([ callback ])</b></code></a>
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="ctor"></a>
|
||||||
|
### new BufferList([ Buffer | Buffer array | BufferList | BufferList array | String ])
|
||||||
|
No arguments are _required_ for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` objects.
|
||||||
|
|
||||||
|
`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferList } = require('bl')
|
||||||
|
const bl = BufferList()
|
||||||
|
|
||||||
|
// equivalent to:
|
||||||
|
|
||||||
|
const { BufferList } = require('bl')
|
||||||
|
const bl = new BufferList()
|
||||||
|
```
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="isBufferList"></a>
|
||||||
|
### BufferList.isBufferList(obj)
|
||||||
|
Determines if the passed object is a `BufferList`. It will return `true` if the passed object is an instance of `BufferList` **or** `BufferListStream` and `false` otherwise.
|
||||||
|
|
||||||
|
N.B. this won't return `true` for `BufferList` or `BufferListStream` instances created by versions of this library before this static method was added.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="length"></a>
|
||||||
|
### bl.length
|
||||||
|
Get the length of the list in bytes. This is the sum of the lengths of all of the buffers contained in the list, minus any initial offset for a semi-consumed buffer at the beginning. Should accurately represent the total number of bytes that can be read from the list.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="append"></a>
|
||||||
|
### bl.append(Buffer | Buffer array | BufferList | BufferList array | String)
|
||||||
|
`append(buffer)` adds an additional buffer or BufferList to the internal list. `this` is returned so it can be chained.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="get"></a>
|
||||||
|
### bl.get(index)
|
||||||
|
`get()` will return the byte at the specified index.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="indexOf"></a>
|
||||||
|
### bl.indexOf(value[, byteOffset][, encoding])
|
||||||
|
`get()` will return the byte at the specified index.
|
||||||
|
`indexOf()` method returns the first index at which a given element can be found in the BufferList, or -1 if it is not present.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="slice"></a>
|
||||||
|
### bl.slice([ start, [ end ] ])
|
||||||
|
`slice()` returns a new `Buffer` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.
|
||||||
|
|
||||||
|
If the requested range spans a single internal buffer then a slice of that buffer will be returned which shares the original memory range of that Buffer. If the range spans multiple buffers then copy operations will likely occur to give you a uniform Buffer.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="shallowSlice"></a>
|
||||||
|
### bl.shallowSlice([ start, [ end ] ])
|
||||||
|
`shallowSlice()` returns a new `BufferList` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.
|
||||||
|
|
||||||
|
No copies will be performed. All buffers in the result share memory with the original list.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="copy"></a>
|
||||||
|
### bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])
|
||||||
|
`copy()` copies the content of the list in the `dest` buffer, starting from `destStart` and containing the bytes within the range specified with `srcStart` to `srcEnd`. `destStart`, `start` and `end` are optional and will default to the beginning of the `dest` buffer, and the beginning and end of the list respectively.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="duplicate"></a>
|
||||||
|
### bl.duplicate()
|
||||||
|
`duplicate()` performs a **shallow-copy** of the list. The internal Buffers remains the same, so if you change the underlying Buffers, the change will be reflected in both the original and the duplicate. This method is needed if you want to call `consume()` or `pipe()` and still keep the original list.Example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var bl = new BufferListStream()
|
||||||
|
|
||||||
|
bl.append('hello')
|
||||||
|
bl.append(' world')
|
||||||
|
bl.append('\n')
|
||||||
|
|
||||||
|
bl.duplicate().pipe(process.stdout, { end: false })
|
||||||
|
|
||||||
|
console.log(bl.toString())
|
||||||
|
```
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="consume"></a>
|
||||||
|
### bl.consume(bytes)
|
||||||
|
`consume()` will shift bytes *off the start of the list*. The number of bytes consumed don't need to line up with the sizes of the internal Buffers—initial offsets will be calculated accordingly in order to give you a consistent view of the data.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="toString"></a>
|
||||||
|
### bl.toString([encoding, [ start, [ end ]]])
|
||||||
|
`toString()` will return a string representation of the buffer. The optional `start` and `end` arguments are passed on to `slice()`, while the `encoding` is passed on to `toString()` of the resulting Buffer. See the [Buffer#toString()](http://nodejs.org/docs/latest/api/buffer.html#buffer_buf_tostring_encoding_start_end) documentation for more information.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="readXX"></a>
|
||||||
|
### bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8()
|
||||||
|
|
||||||
|
All of the standard byte-reading methods of the `Buffer` interface are implemented and will operate across internal Buffer boundaries transparently.
|
||||||
|
|
||||||
|
See the <b><code>[Buffer](http://nodejs.org/docs/latest/api/buffer.html)</code></b> documentation for how these work.
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
<a name="ctorStream"></a>
|
||||||
|
### new BufferListStream([ callback | Buffer | Buffer array | BufferList | BufferList array | String ])
|
||||||
|
**BufferListStream** is a Node **[Duplex Stream](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_duplex)**, so it can be read from and written to like a standard Node stream. You can also `pipe()` to and from a **BufferListStream** instance.
|
||||||
|
|
||||||
|
The constructor takes an optional callback, if supplied, the callback will be called with an error argument followed by a reference to the **bl** instance, when `bl.end()` is called (i.e. from a piped stream). This is a convenient method of collecting the entire contents of a stream, particularly when the stream is *chunky*, such as a network stream.
|
||||||
|
|
||||||
|
Normally, no arguments are required for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` object.
|
||||||
|
|
||||||
|
`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
const bl = BufferListStream()
|
||||||
|
|
||||||
|
// equivalent to:
|
||||||
|
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
const bl = new BufferListStream()
|
||||||
|
```
|
||||||
|
|
||||||
|
N.B. For backwards compatibility reasons, `BufferListStream` is the **default** export when you `require('bl')`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { BufferListStream } = require('bl')
|
||||||
|
// equivalent to:
|
||||||
|
const BufferListStream = require('bl')
|
||||||
|
```
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
**bl** is brought to you by the following hackers:
|
||||||
|
|
||||||
|
* [Rod Vagg](https://github.com/rvagg)
|
||||||
|
* [Matteo Collina](https://github.com/mcollina)
|
||||||
|
* [Jarett Cruger](https://github.com/jcrugzz)
|
||||||
|
|
||||||
|
<a name="license"></a>
|
||||||
|
## License & copyright
|
||||||
|
|
||||||
|
Copyright (c) 2013-2019 bl contributors (listed above).
|
||||||
|
|
||||||
|
bl is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const DuplexStream = require('readable-stream').Duplex
|
||||||
|
const inherits = require('inherits')
|
||||||
|
const BufferList = require('./BufferList')
|
||||||
|
|
||||||
|
function BufferListStream (callback) {
|
||||||
|
if (!(this instanceof BufferListStream)) {
|
||||||
|
return new BufferListStream(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
this._callback = callback
|
||||||
|
|
||||||
|
const piper = function piper (err) {
|
||||||
|
if (this._callback) {
|
||||||
|
this._callback(err)
|
||||||
|
this._callback = null
|
||||||
|
}
|
||||||
|
}.bind(this)
|
||||||
|
|
||||||
|
this.on('pipe', function onPipe (src) {
|
||||||
|
src.on('error', piper)
|
||||||
|
})
|
||||||
|
this.on('unpipe', function onUnpipe (src) {
|
||||||
|
src.removeListener('error', piper)
|
||||||
|
})
|
||||||
|
|
||||||
|
callback = null
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferList._init.call(this, callback)
|
||||||
|
DuplexStream.call(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(BufferListStream, DuplexStream)
|
||||||
|
Object.assign(BufferListStream.prototype, BufferList.prototype)
|
||||||
|
|
||||||
|
BufferListStream.prototype._new = function _new (callback) {
|
||||||
|
return new BufferListStream(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.prototype._write = function _write (buf, encoding, callback) {
|
||||||
|
this._appendBuffer(buf)
|
||||||
|
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.prototype._read = function _read (size) {
|
||||||
|
if (!this.length) {
|
||||||
|
return this.push(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
size = Math.min(size, this.length)
|
||||||
|
this.push(this.slice(0, size))
|
||||||
|
this.consume(size)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.prototype.end = function end (chunk) {
|
||||||
|
DuplexStream.prototype.end.call(this, chunk)
|
||||||
|
|
||||||
|
if (this._callback) {
|
||||||
|
this._callback(null, this.slice())
|
||||||
|
this._callback = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.prototype._destroy = function _destroy (err, cb) {
|
||||||
|
this._bufs.length = 0
|
||||||
|
this.length = 0
|
||||||
|
cb(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.prototype._isBufferList = function _isBufferList (b) {
|
||||||
|
return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferListStream.isBufferList = BufferList.isBufferList
|
||||||
|
|
||||||
|
module.exports = BufferListStream
|
||||||
|
module.exports.BufferListStream = BufferListStream
|
||||||
|
module.exports.BufferList = BufferList
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "bl",
|
||||||
|
"version": "4.1.0",
|
||||||
|
"description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "bl.js",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "standard *.js test/*.js",
|
||||||
|
"test": "npm run lint && node test/test.js | faucet"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/rvagg/bl.git"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/rvagg/bl",
|
||||||
|
"authors": [
|
||||||
|
"Rod Vagg <rod@vagg.org> (https://github.com/rvagg)",
|
||||||
|
"Matteo Collina <matteo.collina@gmail.com> (https://github.com/mcollina)",
|
||||||
|
"Jarett Cruger <jcrugzz@gmail.com> (https://github.com/jcrugzz)"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"buffer",
|
||||||
|
"buffers",
|
||||||
|
"stream",
|
||||||
|
"awesomesauce"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^5.5.0",
|
||||||
|
"inherits": "^2.0.4",
|
||||||
|
"readable-stream": "^3.4.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"faucet": "~0.0.1",
|
||||||
|
"standard": "^14.3.0",
|
||||||
|
"tape": "^4.11.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const tape = require('tape')
|
||||||
|
const { BufferList, BufferListStream } = require('../')
|
||||||
|
const { Buffer } = require('buffer')
|
||||||
|
|
||||||
|
tape('convert from BufferList to BufferListStream', (t) => {
|
||||||
|
const data = Buffer.from(`TEST-${Date.now()}`)
|
||||||
|
const bl = new BufferList(data)
|
||||||
|
const bls = new BufferListStream(bl)
|
||||||
|
t.ok(bl.slice().equals(bls.slice()))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('convert from BufferListStream to BufferList', (t) => {
|
||||||
|
const data = Buffer.from(`TEST-${Date.now()}`)
|
||||||
|
const bls = new BufferListStream(data)
|
||||||
|
const bl = new BufferList(bls)
|
||||||
|
t.ok(bl.slice().equals(bls.slice()))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
+492
@@ -0,0 +1,492 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const tape = require('tape')
|
||||||
|
const BufferList = require('../')
|
||||||
|
const { Buffer } = require('buffer')
|
||||||
|
|
||||||
|
tape('indexOf single byte needle', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'abcdefg', '12345'])
|
||||||
|
|
||||||
|
t.equal(bl.indexOf('e'), 4)
|
||||||
|
t.equal(bl.indexOf('e', 5), 11)
|
||||||
|
t.equal(bl.indexOf('e', 12), -1)
|
||||||
|
t.equal(bl.indexOf('5'), 18)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf multiple byte needle', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'abcdefg'])
|
||||||
|
|
||||||
|
t.equal(bl.indexOf('ef'), 4)
|
||||||
|
t.equal(bl.indexOf('ef', 5), 11)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf multiple byte needles across buffer boundaries', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'abcdefg'])
|
||||||
|
|
||||||
|
t.equal(bl.indexOf('fgabc'), 5)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf takes a Uint8Array search', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'abcdefg'])
|
||||||
|
const search = new Uint8Array([102, 103, 97, 98, 99]) // fgabc
|
||||||
|
|
||||||
|
t.equal(bl.indexOf(search), 5)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf takes a buffer list search', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'abcdefg'])
|
||||||
|
const search = new BufferList('fgabc')
|
||||||
|
|
||||||
|
t.equal(bl.indexOf(search), 5)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf a zero byte needle', (t) => {
|
||||||
|
const b = new BufferList('abcdef')
|
||||||
|
const bufEmpty = Buffer.from('')
|
||||||
|
|
||||||
|
t.equal(b.indexOf(''), 0)
|
||||||
|
t.equal(b.indexOf('', 1), 1)
|
||||||
|
t.equal(b.indexOf('', b.length + 1), b.length)
|
||||||
|
t.equal(b.indexOf('', Infinity), b.length)
|
||||||
|
t.equal(b.indexOf(bufEmpty), 0)
|
||||||
|
t.equal(b.indexOf(bufEmpty, 1), 1)
|
||||||
|
t.equal(b.indexOf(bufEmpty, b.length + 1), b.length)
|
||||||
|
t.equal(b.indexOf(bufEmpty, Infinity), b.length)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf buffers smaller and larger than the needle', (t) => {
|
||||||
|
const bl = new BufferList(['abcdefg', 'a', 'bcdefg', 'a', 'bcfgab'])
|
||||||
|
|
||||||
|
t.equal(bl.indexOf('fgabc'), 5)
|
||||||
|
t.equal(bl.indexOf('fgabc', 6), 12)
|
||||||
|
t.equal(bl.indexOf('fgabc', 13), -1)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
// only present in node 6+
|
||||||
|
;(process.version.substr(1).split('.')[0] >= 6) && tape('indexOf latin1 and binary encoding', (t) => {
|
||||||
|
const b = new BufferList('abcdef')
|
||||||
|
|
||||||
|
// test latin1 encoding
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from(b.toString('latin1'), 'latin1'))
|
||||||
|
.indexOf('d', 0, 'latin1'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from(b.toString('latin1'), 'latin1'))
|
||||||
|
.indexOf(Buffer.from('d', 'latin1'), 0, 'latin1'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('aa\u00e8aa', 'latin1'))
|
||||||
|
.indexOf('\u00e8', 'latin1'),
|
||||||
|
2
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('\u00e8', 'latin1'))
|
||||||
|
.indexOf('\u00e8', 'latin1'),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('\u00e8', 'latin1'))
|
||||||
|
.indexOf(Buffer.from('\u00e8', 'latin1'), 'latin1'),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
|
||||||
|
// test binary encoding
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from(b.toString('binary'), 'binary'))
|
||||||
|
.indexOf('d', 0, 'binary'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from(b.toString('binary'), 'binary'))
|
||||||
|
.indexOf(Buffer.from('d', 'binary'), 0, 'binary'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('aa\u00e8aa', 'binary'))
|
||||||
|
.indexOf('\u00e8', 'binary'),
|
||||||
|
2
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('\u00e8', 'binary'))
|
||||||
|
.indexOf('\u00e8', 'binary'),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
new BufferList(Buffer.from('\u00e8', 'binary'))
|
||||||
|
.indexOf(Buffer.from('\u00e8', 'binary'), 'binary'),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('indexOf the entire nodejs10 buffer test suite', (t) => {
|
||||||
|
const b = new BufferList('abcdef')
|
||||||
|
const bufA = Buffer.from('a')
|
||||||
|
const bufBc = Buffer.from('bc')
|
||||||
|
const bufF = Buffer.from('f')
|
||||||
|
const bufZ = Buffer.from('z')
|
||||||
|
|
||||||
|
const stringComparison = 'abcdef'
|
||||||
|
|
||||||
|
t.equal(b.indexOf('a'), 0)
|
||||||
|
t.equal(b.indexOf('a', 1), -1)
|
||||||
|
t.equal(b.indexOf('a', -1), -1)
|
||||||
|
t.equal(b.indexOf('a', -4), -1)
|
||||||
|
t.equal(b.indexOf('a', -b.length), 0)
|
||||||
|
t.equal(b.indexOf('a', NaN), 0)
|
||||||
|
t.equal(b.indexOf('a', -Infinity), 0)
|
||||||
|
t.equal(b.indexOf('a', Infinity), -1)
|
||||||
|
t.equal(b.indexOf('bc'), 1)
|
||||||
|
t.equal(b.indexOf('bc', 2), -1)
|
||||||
|
t.equal(b.indexOf('bc', -1), -1)
|
||||||
|
t.equal(b.indexOf('bc', -3), -1)
|
||||||
|
t.equal(b.indexOf('bc', -5), 1)
|
||||||
|
t.equal(b.indexOf('bc', NaN), 1)
|
||||||
|
t.equal(b.indexOf('bc', -Infinity), 1)
|
||||||
|
t.equal(b.indexOf('bc', Infinity), -1)
|
||||||
|
t.equal(b.indexOf('f'), b.length - 1)
|
||||||
|
t.equal(b.indexOf('z'), -1)
|
||||||
|
|
||||||
|
// empty search tests
|
||||||
|
t.equal(b.indexOf(bufA), 0)
|
||||||
|
t.equal(b.indexOf(bufA, 1), -1)
|
||||||
|
t.equal(b.indexOf(bufA, -1), -1)
|
||||||
|
t.equal(b.indexOf(bufA, -4), -1)
|
||||||
|
t.equal(b.indexOf(bufA, -b.length), 0)
|
||||||
|
t.equal(b.indexOf(bufA, NaN), 0)
|
||||||
|
t.equal(b.indexOf(bufA, -Infinity), 0)
|
||||||
|
t.equal(b.indexOf(bufA, Infinity), -1)
|
||||||
|
t.equal(b.indexOf(bufBc), 1)
|
||||||
|
t.equal(b.indexOf(bufBc, 2), -1)
|
||||||
|
t.equal(b.indexOf(bufBc, -1), -1)
|
||||||
|
t.equal(b.indexOf(bufBc, -3), -1)
|
||||||
|
t.equal(b.indexOf(bufBc, -5), 1)
|
||||||
|
t.equal(b.indexOf(bufBc, NaN), 1)
|
||||||
|
t.equal(b.indexOf(bufBc, -Infinity), 1)
|
||||||
|
t.equal(b.indexOf(bufBc, Infinity), -1)
|
||||||
|
t.equal(b.indexOf(bufF), b.length - 1)
|
||||||
|
t.equal(b.indexOf(bufZ), -1)
|
||||||
|
t.equal(b.indexOf(0x61), 0)
|
||||||
|
t.equal(b.indexOf(0x61, 1), -1)
|
||||||
|
t.equal(b.indexOf(0x61, -1), -1)
|
||||||
|
t.equal(b.indexOf(0x61, -4), -1)
|
||||||
|
t.equal(b.indexOf(0x61, -b.length), 0)
|
||||||
|
t.equal(b.indexOf(0x61, NaN), 0)
|
||||||
|
t.equal(b.indexOf(0x61, -Infinity), 0)
|
||||||
|
t.equal(b.indexOf(0x61, Infinity), -1)
|
||||||
|
t.equal(b.indexOf(0x0), -1)
|
||||||
|
|
||||||
|
// test offsets
|
||||||
|
t.equal(b.indexOf('d', 2), 3)
|
||||||
|
t.equal(b.indexOf('f', 5), 5)
|
||||||
|
t.equal(b.indexOf('f', -1), 5)
|
||||||
|
t.equal(b.indexOf('f', 6), -1)
|
||||||
|
|
||||||
|
t.equal(b.indexOf(Buffer.from('d'), 2), 3)
|
||||||
|
t.equal(b.indexOf(Buffer.from('f'), 5), 5)
|
||||||
|
t.equal(b.indexOf(Buffer.from('f'), -1), 5)
|
||||||
|
t.equal(b.indexOf(Buffer.from('f'), 6), -1)
|
||||||
|
|
||||||
|
t.equal(Buffer.from('ff').indexOf(Buffer.from('f'), 1, 'ucs2'), -1)
|
||||||
|
|
||||||
|
// test invalid and uppercase encoding
|
||||||
|
t.equal(b.indexOf('b', 'utf8'), 1)
|
||||||
|
t.equal(b.indexOf('b', 'UTF8'), 1)
|
||||||
|
t.equal(b.indexOf('62', 'HEX'), 1)
|
||||||
|
t.throws(() => b.indexOf('bad', 'enc'), TypeError)
|
||||||
|
|
||||||
|
// test hex encoding
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('hex'), 'hex')
|
||||||
|
.indexOf('64', 0, 'hex'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('hex'), 'hex')
|
||||||
|
.indexOf(Buffer.from('64', 'hex'), 0, 'hex'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
|
||||||
|
// test base64 encoding
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('base64'), 'base64')
|
||||||
|
.indexOf('ZA==', 0, 'base64'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('base64'), 'base64')
|
||||||
|
.indexOf(Buffer.from('ZA==', 'base64'), 0, 'base64'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
|
||||||
|
// test ascii encoding
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('ascii'), 'ascii')
|
||||||
|
.indexOf('d', 0, 'ascii'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
t.equal(
|
||||||
|
Buffer.from(b.toString('ascii'), 'ascii')
|
||||||
|
.indexOf(Buffer.from('d', 'ascii'), 0, 'ascii'),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
|
||||||
|
// test optional offset with passed encoding
|
||||||
|
t.equal(Buffer.from('aaaa0').indexOf('30', 'hex'), 4)
|
||||||
|
t.equal(Buffer.from('aaaa00a').indexOf('3030', 'hex'), 4)
|
||||||
|
|
||||||
|
{
|
||||||
|
// test usc2 encoding
|
||||||
|
const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2')
|
||||||
|
|
||||||
|
t.equal(8, twoByteString.indexOf('\u0395', 4, 'ucs2'))
|
||||||
|
t.equal(6, twoByteString.indexOf('\u03a3', -4, 'ucs2'))
|
||||||
|
t.equal(4, twoByteString.indexOf('\u03a3', -6, 'ucs2'))
|
||||||
|
t.equal(4, twoByteString.indexOf(
|
||||||
|
Buffer.from('\u03a3', 'ucs2'), -6, 'ucs2'))
|
||||||
|
t.equal(-1, twoByteString.indexOf('\u03a3', -2, 'ucs2'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const mixedByteStringUcs2 =
|
||||||
|
Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2')
|
||||||
|
|
||||||
|
t.equal(6, mixedByteStringUcs2.indexOf('bc', 0, 'ucs2'))
|
||||||
|
t.equal(10, mixedByteStringUcs2.indexOf('\u03a3', 0, 'ucs2'))
|
||||||
|
t.equal(-1, mixedByteStringUcs2.indexOf('\u0396', 0, 'ucs2'))
|
||||||
|
|
||||||
|
t.equal(
|
||||||
|
6, mixedByteStringUcs2.indexOf(Buffer.from('bc', 'ucs2'), 0, 'ucs2'))
|
||||||
|
t.equal(
|
||||||
|
10, mixedByteStringUcs2.indexOf(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'))
|
||||||
|
t.equal(
|
||||||
|
-1, mixedByteStringUcs2.indexOf(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2'))
|
||||||
|
|
||||||
|
{
|
||||||
|
const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2')
|
||||||
|
|
||||||
|
// Test single char pattern
|
||||||
|
t.equal(0, twoByteString.indexOf('\u039a', 0, 'ucs2'))
|
||||||
|
let index = twoByteString.indexOf('\u0391', 0, 'ucs2')
|
||||||
|
t.equal(2, index, `Alpha - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u03a3', 0, 'ucs2')
|
||||||
|
t.equal(4, index, `First Sigma - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u03a3', 6, 'ucs2')
|
||||||
|
t.equal(6, index, `Second Sigma - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u0395', 0, 'ucs2')
|
||||||
|
t.equal(8, index, `Epsilon - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u0392', 0, 'ucs2')
|
||||||
|
t.equal(-1, index, `Not beta - at index ${index}`)
|
||||||
|
|
||||||
|
// Test multi-char pattern
|
||||||
|
index = twoByteString.indexOf('\u039a\u0391', 0, 'ucs2')
|
||||||
|
t.equal(0, index, `Lambda Alpha - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u0391\u03a3', 0, 'ucs2')
|
||||||
|
t.equal(2, index, `Alpha Sigma - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u03a3\u03a3', 0, 'ucs2')
|
||||||
|
t.equal(4, index, `Sigma Sigma - at index ${index}`)
|
||||||
|
index = twoByteString.indexOf('\u03a3\u0395', 0, 'ucs2')
|
||||||
|
t.equal(6, index, `Sigma Epsilon - at index ${index}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395')
|
||||||
|
|
||||||
|
t.equal(5, mixedByteStringUtf8.indexOf('bc'))
|
||||||
|
t.equal(5, mixedByteStringUtf8.indexOf('bc', 5))
|
||||||
|
t.equal(5, mixedByteStringUtf8.indexOf('bc', -8))
|
||||||
|
t.equal(7, mixedByteStringUtf8.indexOf('\u03a3'))
|
||||||
|
t.equal(-1, mixedByteStringUtf8.indexOf('\u0396'))
|
||||||
|
|
||||||
|
// Test complex string indexOf algorithms. Only trigger for long strings.
|
||||||
|
// Long string that isn't a simple repeat of a shorter string.
|
||||||
|
let longString = 'A'
|
||||||
|
for (let i = 66; i < 76; i++) { // from 'B' to 'K'
|
||||||
|
longString = longString + String.fromCharCode(i) + longString
|
||||||
|
}
|
||||||
|
|
||||||
|
const longBufferString = Buffer.from(longString)
|
||||||
|
|
||||||
|
// pattern of 15 chars, repeated every 16 chars in long
|
||||||
|
let pattern = 'ABACABADABACABA'
|
||||||
|
for (let i = 0; i < longBufferString.length - pattern.length; i += 7) {
|
||||||
|
const index = longBufferString.indexOf(pattern, i)
|
||||||
|
t.equal((i + 15) & ~0xf, index,
|
||||||
|
`Long ABACABA...-string at index ${i}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = longBufferString.indexOf('AJABACA')
|
||||||
|
t.equal(510, index, `Long AJABACA, First J - at index ${index}`)
|
||||||
|
index = longBufferString.indexOf('AJABACA', 511)
|
||||||
|
t.equal(1534, index, `Long AJABACA, Second J - at index ${index}`)
|
||||||
|
|
||||||
|
pattern = 'JABACABADABACABA'
|
||||||
|
index = longBufferString.indexOf(pattern)
|
||||||
|
t.equal(511, index, `Long JABACABA..., First J - at index ${index}`)
|
||||||
|
index = longBufferString.indexOf(pattern, 512)
|
||||||
|
t.equal(
|
||||||
|
1535, index, `Long JABACABA..., Second J - at index ${index}`)
|
||||||
|
|
||||||
|
// Search for a non-ASCII string in a pure ASCII string.
|
||||||
|
const asciiString = Buffer.from(
|
||||||
|
'somethingnotatallsinisterwhichalsoworks')
|
||||||
|
t.equal(-1, asciiString.indexOf('\x2061'))
|
||||||
|
t.equal(3, asciiString.indexOf('eth', 0))
|
||||||
|
|
||||||
|
// Search in string containing many non-ASCII chars.
|
||||||
|
const allCodePoints = []
|
||||||
|
for (let i = 0; i < 65536; i++) {
|
||||||
|
allCodePoints[i] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
const allCharsString = String.fromCharCode.apply(String, allCodePoints)
|
||||||
|
const allCharsBufferUtf8 = Buffer.from(allCharsString)
|
||||||
|
const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2')
|
||||||
|
|
||||||
|
// Search for string long enough to trigger complex search with ASCII pattern
|
||||||
|
// and UC16 subject.
|
||||||
|
t.equal(-1, allCharsBufferUtf8.indexOf('notfound'))
|
||||||
|
t.equal(-1, allCharsBufferUcs2.indexOf('notfound'))
|
||||||
|
|
||||||
|
// Needle is longer than haystack, but only because it's encoded as UTF-16
|
||||||
|
t.equal(Buffer.from('aaaa').indexOf('a'.repeat(4), 'ucs2'), -1)
|
||||||
|
|
||||||
|
t.equal(Buffer.from('aaaa').indexOf('a'.repeat(4), 'utf8'), 0)
|
||||||
|
t.equal(Buffer.from('aaaa').indexOf('你好', 'ucs2'), -1)
|
||||||
|
|
||||||
|
// Haystack has odd length, but the needle is UCS2.
|
||||||
|
t.equal(Buffer.from('aaaaa').indexOf('b', 'ucs2'), -1)
|
||||||
|
|
||||||
|
{
|
||||||
|
// Find substrings in Utf8.
|
||||||
|
const lengths = [1, 3, 15] // Single char, simple and complex.
|
||||||
|
const indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b]
|
||||||
|
for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
|
||||||
|
for (let i = 0; i < indices.length; i++) {
|
||||||
|
const index = indices[i]
|
||||||
|
let length = lengths[lengthIndex]
|
||||||
|
|
||||||
|
if (index + length > 0x7F) {
|
||||||
|
length = 2 * length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index + length > 0x7FF) {
|
||||||
|
length = 3 * length
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index + length > 0xFFFF) {
|
||||||
|
length = 4 * length
|
||||||
|
}
|
||||||
|
|
||||||
|
const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length)
|
||||||
|
t.equal(index, allCharsBufferUtf8.indexOf(patternBufferUtf8))
|
||||||
|
|
||||||
|
const patternStringUtf8 = patternBufferUtf8.toString()
|
||||||
|
t.equal(index, allCharsBufferUtf8.indexOf(patternStringUtf8))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Find substrings in Usc2.
|
||||||
|
const lengths = [2, 4, 16] // Single char, simple and complex.
|
||||||
|
const indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0]
|
||||||
|
|
||||||
|
for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
|
||||||
|
for (let i = 0; i < indices.length; i++) {
|
||||||
|
const index = indices[i] * 2
|
||||||
|
const length = lengths[lengthIndex]
|
||||||
|
|
||||||
|
const patternBufferUcs2 =
|
||||||
|
allCharsBufferUcs2.slice(index, index + length)
|
||||||
|
t.equal(
|
||||||
|
index, allCharsBufferUcs2.indexOf(patternBufferUcs2, 0, 'ucs2'))
|
||||||
|
|
||||||
|
const patternStringUcs2 = patternBufferUcs2.toString('ucs2')
|
||||||
|
t.equal(
|
||||||
|
index, allCharsBufferUcs2.indexOf(patternStringUcs2, 0, 'ucs2'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
() => {},
|
||||||
|
{},
|
||||||
|
[]
|
||||||
|
].forEach((val) => {
|
||||||
|
t.throws(() => b.indexOf(val), TypeError, `"${JSON.stringify(val)}" should throw`)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Test weird offset arguments.
|
||||||
|
// The following offsets coerce to NaN or 0, searching the whole Buffer
|
||||||
|
t.equal(b.indexOf('b', undefined), 1)
|
||||||
|
t.equal(b.indexOf('b', {}), 1)
|
||||||
|
t.equal(b.indexOf('b', 0), 1)
|
||||||
|
t.equal(b.indexOf('b', null), 1)
|
||||||
|
t.equal(b.indexOf('b', []), 1)
|
||||||
|
|
||||||
|
// The following offset coerces to 2, in other words +[2] === 2
|
||||||
|
t.equal(b.indexOf('b', [2]), -1)
|
||||||
|
|
||||||
|
// Behavior should match String.indexOf()
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', undefined),
|
||||||
|
stringComparison.indexOf('b', undefined))
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', {}),
|
||||||
|
stringComparison.indexOf('b', {}))
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', 0),
|
||||||
|
stringComparison.indexOf('b', 0))
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', null),
|
||||||
|
stringComparison.indexOf('b', null))
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', []),
|
||||||
|
stringComparison.indexOf('b', []))
|
||||||
|
t.equal(
|
||||||
|
b.indexOf('b', [2]),
|
||||||
|
stringComparison.indexOf('b', [2]))
|
||||||
|
|
||||||
|
// test truncation of Number arguments to uint8
|
||||||
|
{
|
||||||
|
const buf = Buffer.from('this is a test')
|
||||||
|
|
||||||
|
t.equal(buf.indexOf(0x6973), 3)
|
||||||
|
t.equal(buf.indexOf(0x697320), 4)
|
||||||
|
t.equal(buf.indexOf(0x69732069), 2)
|
||||||
|
t.equal(buf.indexOf(0x697374657374), 0)
|
||||||
|
t.equal(buf.indexOf(0x69737374), 0)
|
||||||
|
t.equal(buf.indexOf(0x69737465), 11)
|
||||||
|
t.equal(buf.indexOf(0x69737465), 11)
|
||||||
|
t.equal(buf.indexOf(-140), 0)
|
||||||
|
t.equal(buf.indexOf(-152), 1)
|
||||||
|
t.equal(buf.indexOf(0xff), -1)
|
||||||
|
t.equal(buf.indexOf(0xffff), -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that Uint8Array arguments are okay.
|
||||||
|
{
|
||||||
|
const needle = new Uint8Array([0x66, 0x6f, 0x6f])
|
||||||
|
const haystack = new BufferList(Buffer.from('a foo b foo'))
|
||||||
|
t.equal(haystack.indexOf(needle), 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const tape = require('tape')
|
||||||
|
const { BufferList, BufferListStream } = require('../')
|
||||||
|
const { Buffer } = require('buffer')
|
||||||
|
|
||||||
|
tape('isBufferList positives', (t) => {
|
||||||
|
t.ok(BufferList.isBufferList(new BufferList()))
|
||||||
|
t.ok(BufferList.isBufferList(new BufferListStream()))
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
tape('isBufferList negatives', (t) => {
|
||||||
|
const types = [
|
||||||
|
null,
|
||||||
|
undefined,
|
||||||
|
NaN,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
{},
|
||||||
|
[],
|
||||||
|
Buffer.alloc(0),
|
||||||
|
[Buffer.alloc(0)]
|
||||||
|
]
|
||||||
|
|
||||||
|
for (const obj of types) {
|
||||||
|
t.notOk(BufferList.isBufferList(obj))
|
||||||
|
}
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user